应用场景:
限制用户显示名称的长度(实际是限制用户显示名称在页面上的显示宽度)
面临的问题:
由于中文字符与英文字符的显示宽度是不一样的,如果直接根据字符数进行限制,显然是不行的。
代码示例:
【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
建议看一下这篇文章,如果性能方面要求不高的话。
谢谢!在C#中用System.Text.Encoding.Default.GetByteCount()可以搞定:
Console.WriteLine(System.Text.Encoding.Default.GetByteCount("博客园开发者的网上家园代码改变世界努力中")); //output 40
就剩下Javascript了
@dudu: javascript的
请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。
默认编码不是 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);
}
中文字符当作2个英文字符 可能也会出项问题,
w 和 i 的宽度肯定是不一样的
http://blog.csdn.net/leftfist/article/details/695270
上面这个地址倒是有你想要的资料
<span id="p1" style="visibility:hidden"></span>
<script type="text/javascript">
function SC(){
document.getElementById("p1").innerHTML = "你的字符串";
alert(document.getElementById("p1").offsetWidth);
}
我觉得这样应该就可以实现了
@刘宏玺 的方法是很合理的,一般也这样用。
<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>
这是一个巧妙的方法!