gpt4 book ai didi

javascript - 如何在Javascript中获取日文字符的长度?

转载 作者:行者123 更新时间:2023-11-28 05:29:55 25 4
gpt4 key购买 nike

我有一个带有 SHIFT_JIS 字符集的 ASP Classic 页面。页面head部分下的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 编码的日语字符的正确长度。例如,字符“测”的 SHIFT_JIS 长度为 8 个字符,但 Javascript 只能将其识别为一个字符,可能是因为 Javascript 默认使用 Unicode 编码。有些字符(例如ケ)在 SHIFT_JIS 中时有 2 或 3 个字符。

如果我只依赖 Javascript 提供的长度,长日语字符将通过页面验证,并且它将尝试保存在数据库中,但由于数据库列的最大长度为 200,因此会失败。

我使用的浏览器是 Internet Explorer。有没有办法使用 Javascript 获取日语字符的 SHIFT_JIS 长度?是否可以使用 Javascript 将 Unicode 转换为 SHIFT_JIS?如何?

感谢您的帮助!

最佳答案

For example, the character 测 has a SHIFT_JIS length of 8 characters, but Javascript is only recognizing it as one character, probably because of the Unicode encoding

我们要明确一点:测,U+6D4B(汉字“测量、估计、推测”)是一个单字。当您将其编码为特定编码(例如 Shift-JIS)时,它很可能会变成多个字节

一般来说,JavaScript 不提供可用的编码表,因此您无法找出一个字符将占用多少字节。如果你真的需要,你必须携带足够的数据来自己解决。例如,如果您假设输入仅包含 Shift-JIS 中有效的字符,则此函数将通过保留所有单字节字符的列表并假设每个其他字符都占用 来计算出需要多少字节。两个字节:

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

但是,Shift-JIS 中没有 8 字节序列,并且字符“测”在 Shift-JIS 中根本不可用。 (这是日本不使用的汉字。)

为什么你可能认为它构成了一个 8 字节序列是这样的:当浏览器无法提交表单中的字符时,因为它不存在于目标字符集中,它会用 HTML 字符引用替换它:在本例中。这是一种有损的损坏:您无法判断用户是按字面输入 还是 。如果您将提交的内容 显示为 ,那么这意味着您忘记对输出进行 HTML 编码,这可能意味着您的应用程序很容易受到跨站点脚本编写。

唯一明智的答案是使用 UTF-8 而不是 Shift-JIS。 UTF-8 可以愉快地对测量或任何其他字符进行编码,而不必求助于损坏的 HTML 字符引用。如果您需要在数据库中存储受编码字节长度限制的内容,可以使用一个偷偷摸摸的技巧来获取字符串中的 UTF-8 字节数:

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

尽管在数据库中存储 native Unicode 字符串可能会更好,这样长度限制是指实际字符而不是某些编码中的字节。

关于javascript - 如何在Javascript中获取日文字符的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com