如何获得的日文字符在Javascript的长度?(How to get the length of

2019-06-26 06:20发布

我有SHIFT_JIS字符集的ASP经典页。 在页面的头部分的meta标签是这样的:

<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">

我的页面有一个文本框(txtName的)应只允许200个字符。 我有一个JavaScript函数,验证字符长度,这被称为我的提交按钮的onclick()事件。

if(document.frmPage.txtName.value.length > 200) {
  alert("You have exceeded the maximum length of 200.");
  return false;
}

问题是,JavaScript是没有得到在SHIFT_JIS编码的日文字符的正确长度。 例如,字符测具有8个字符的长度SHIFT_JIS,但JavaScript是仅其识别为一个字符,可能是因为其使用Javascript默认使用Unicode编码的。 像ケ某些字符有2首或3个字符SHIFT_JIS时。

如果我只依赖于Java脚本所提供的长,长的日文字符会通过页面验证,它会尝试保存数据库,然后将失败,因为数据库列的200最大长度上。

我使用的Internet Explorer浏览器。 有没有办法让使用Javascript的日文字符的长度SHIFT_JIS? 是否有可能从Unicode转换为使用Javascript功能来SHIFT_JIS? 怎么样?

谢谢您的帮助!

Answer 1:

例如,字符测具有8个字符的长度SHIFT_JIS,但JavaScript是仅其识别为一个字符,可能是因为Unicode编码的

让我们清楚:测,U + 6D4B(韩字“的措施,估计,推测”) 单个字符。 当它进行编码,以像移位-JIS一个特定的编码,它很可能成为多个字节

在一般的JavaScript不会使编码可用,所以你不能找出一个字符将有多少字节占用表。 如果你真的需要,你要随身携带足够的数据来解决它自己。 例如,如果假设输入仅包含在按住Shift JIS有效的字符,该功能将制定通过保持是一个字节的所有字符的列表,并假设所有其他字符占用了多少字节需要两个字节:

function getShiftJISByteLength(s) {
    return s.replace(/[^\x00-\x80。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン ゙ ゚]/g, 'xx').length;
}

但是,也有在移-JIS无8字节序列,并且该字符测不可用在移-JIS的。 (这是一个在日本未使用的中国性格。)

为什么你可能会想它构成了一个8字节的顺序是这样的:当浏览器不能在表单提交字符,因为它不会在目标字符集存在,它与HTML字符引用替换它:在这种情况下, &#27979; 。 这是一种有损忙玲:你不能告诉用户是否原样输入&#27979; 。 如果你正在显示提交的内容&#27979;那么这意味着你忘记HTML编码您的输出,这可能意味着你的应用程序是非常容易受到跨站点脚本。

唯一明智的答案是使用UTF-8,而不是按住Shift JIS的。 UTF-8可以愉快地编码测,或任何其他字符,而不必求助于破碎HTML字符引用。 如果您需要在数据库中存储的编码的字节长度的限制内容,有偷偷摸摸的黑客,你可以用它来得到的字符串中的UTF-8字节数:

function getUTF8ByteLength(s) {
    return unescape(encodeURIComponent(s)).length;
}

虽然可能会是更好的本地存储Unicode字符串在数据库中,这样的长度的限制是指实际的字符,而不是字节编码一些。



Answer 2:

你感到困惑的字符和字节之间。 测是一个字符,但是你看看吧。 在UTF-16(这是JavaScript使用),这是两个字节。 在SHIFT_JIS,8个字节,显然。 但是,在这两种情况下,这是一个字符。 所以,你正在试图做的是限制文本长度200个字节 。 由于Javascript使用UTF-16(UCS-2,真的),你可以得到它是由2字符串的长度乘以字节长度,但它不能帮助你SHIFT_JIS。 话又说回来,你或许应该考虑转换为Unicode无论如何,如果你正在使用JavaScript ...



文章来源: How to get the length of Japanese characters in Javascript?