首页 新闻 会员 周边

计算字符串长度面临的中英文问题

0
悬赏园豆:50 [已解决问题] 解决于 2014-11-21 13:05

应用场景:

限制用户显示名称的长度(实际是限制用户显示名称在页面上的显示宽度)

面临的问题:

由于中文字符与英文字符的显示宽度是不一样的,如果直接根据字符数进行限制,显然是不行的。

代码示例:

【Javascript】

console.log('博客园开发者的网上家园代码改变世界努力中'.length);//output 20
console.log('cnblogsdeveloperhome'.length); //output 20

【C#】

Console.WriteLine("博客园开发者的网上家园代码改变世界努力中".Length); //output 20
Console.WriteLine("cnblogsdeveloperhome".Length); //output 20

上面的代码中,虽然中英文字符串的长度都是20,但中文字符串的显示宽度会明显大于英文字符串。

所以,要解决这个问题,需要在计算字符串长度时把1个中文字符当作2个英文字符进行计算,但目前不知道如何去实现?

问题补充:

在C#中可以通过System.Text.Encoding.Default.GetByteCount()解决,1个中文字符是2个字节(该解决方法由 @爱编程的大叔 提供),代码如下:

var s = "博客园开发者的网上家园代码改变世界努力中";
Console.WriteLine(System.Text.Encoding.Default.GetByteCount(s)); //output 40

在Javascript中,可以通过正则表达式将中文字符替换为英文字符,然后计算长度(该解决方法由 @jiangming 提供),代码如下:

var s = '博客园开发者的网上家园代码改变世界努力中';
console.log(s.replace(/[^\x00-\xff]/g, 'aa').length); //output 40
dudu的主页 dudu | 高人七级 | 园豆:30979
提问于:2014-11-21 11:29
< >
分享
最佳答案
1

建议看一下这篇文章,如果性能方面要求不高的话。

C#实现 获取指定字节长度 中英文混合字符串 的方法

收获园豆:20
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-11-21 11:40

谢谢!在C#中用System.Text.Encoding.Default.GetByteCount()可以搞定:

Console.WriteLine(System.Text.Encoding.Default.GetByteCount("博客园开发者的网上家园代码改变世界努力中")); //output 40

就剩下Javascript了

dudu | 园豆:30979 (高人七级) | 2014-11-21 11:45

@dudu: javascript的

javascript 判断中文字符长度的函数代码

 

请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。 

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-11-21 12:09

默认编码不是 GB2312 的实现代码:

public static int UnifiedLength(this string text)
{
    try
    {
        return Encoding.GetEncoding("GB2312").GetByteCount(text);
    }
    catch // 'GB2312' is not a supported encoding name
    {
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    }

    return Encoding.GetEncoding("GB2312").GetByteCount(text);
}
dudu | 园豆:30979 (高人七级) | 2022-07-24 13:42
其他回答(3)
0

中文字符当作2个英文字符 可能也会出项问题,

w 和 i 的宽度肯定是不一样的

 

http://blog.csdn.net/leftfist/article/details/695270

上面这个地址倒是有你想要的资料

收获园豆:5
刘宏玺 | 园豆:14020 (专家六级) | 2014-11-21 11:38

<span id="p1"  style="visibility:hidden"></span>

<script type="text/javascript">
function SC(){
document.getElementById("p1").innerHTML = "你的字符串";
alert(document.getElementById("p1").offsetWidth);
}

 

我觉得这样应该就可以实现了

支持(0) 反对(1) 刘宏玺 | 园豆:14020 (专家六级) | 2014-11-21 11:41
0

@刘宏玺 的方法是很合理的,一般也这样用。

 <body>
        <input type="text" id="t" />
        <button onclick="fun()">Test</button>
    </body>
    <script>
        function fun(){
            var text = document.getElementById('t').value;
            var span = document.createElement('span');//行内元素
            span.innerHTML = text;
            //span.style.marginLeft = '-10000px';//让元素跑到屏幕外
            document.body.appendChild(span);
            alert(span.offsetWidth);
            //document.body.removeChild(span);
        }
    </script>
收获园豆:5
幻天芒 | 园豆:37175 (高人七级) | 2014-11-21 12:20
2
String(str).replace(/[^\x00-\xff]/g, 'aa').length
js长度.
收获园豆:20
只会造轮子 | 园豆:2274 (老鸟四级) | 2014-11-21 12:31

这是一个巧妙的方法!

支持(0) 反对(0) dudu | 园豆:30979 (高人七级) | 2014-11-21 12:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册