Javascript 添加'';使用jQuery

Javascript 添加'';使用jQuery,javascript,ascii,Javascript,Ascii,javascript长度和子字符串函数不考虑非ascii字符 我有一个函数,如果用户输入的字符超过400个,则将用户输入的子字符串设置为400个字符 e、 g 但是,如果输入非ascii字符(双字节字符),则此操作不起作用。它不考虑等式中的字符类型 我有另一个函数,它循环每个字符,如果它是非ascii码,它增加一个计数器,然后计算出真正的计数是多少。它可以工作,但有点像黑客 有没有更有效的方法来实现这一点,或者没有其他选择 谢谢我认为正则表达式可以完成这项工作 var data = /.{0,4

javascript长度和子字符串函数不考虑非ascii字符

我有一个函数,如果用户输入的字符超过400个,则将用户输入的子字符串设置为400个字符

e、 g

但是,如果输入非ascii字符(双字节字符),则此操作不起作用。它不考虑等式中的字符类型

我有另一个函数,它循环每个字符,如果它是非ascii码,它增加一个计数器,然后计算出真正的计数是多少。它可以工作,但有点像黑客

有没有更有效的方法来实现这一点,或者没有其他选择


谢谢

我认为正则表达式可以完成这项工作

var data = /.{0,400}/.exec(originalData)[0];

JavaScript和web浏览器的本机字符集通常是UTF-16。字符串是UTF-16代码单元的序列。没有“双字节”字符编码的概念

如果您想计算一个字符串在一个特定的双字节编码中将占用多少字节,您需要知道它是什么编码,以及如何自己编码;JavaScript本机无法访问这些信息。例如,使用Shift_-JIS,您必须知道哪些字符是可以编码为单字节的假名,哪些字符参与双字节汉字序列

没有任何编码将表示ASCII的所有代码单元存储在一个字节中,而将除ASCII以外的所有代码单元存储在两个字节中,因此无论您试图通过将非ASCII计算为两个来解决什么问题,循环和加法可能都不是正确的答案

无论如何,老派的双字节编码是一个可怕的时代错误,需要尽可能避免。如果需要节省空间的字节编码,则需要UTF-8。以UTF-8字节计算字符串的长度很容易,因为JS有一个隐蔽的内置UTF-8编码器,您可以利用:

var byten= unescape(encodeURIComponent(chars)).length;
将字符串剪切到400字节有些棘手,因为您希望避免破坏多字节序列。如果尝试UTF-8解码结尾处序列中断的内容,则会出现异常,因此请捕获它并重试:

var bytes= unescape(encodeURIComponent(chars)).slice(0, 400);
while (bytes.length>0) {
    try {
        chars= decodeURIComponent(escape(bytes));
        break
    } catch (e) {
        bytes= bytes.slice(0, -1);
    }
}

但根据特定编码将占用的字节数限制输入是不寻常的。字符数的直接限制更为典型。您想做什么?

因为:如果要检索匹配的字符串部分,请调用您创建的RegExp对象的exec()函数,例如:mymatch=myregexp.exec(“主题”)。此函数返回一个数组。数组中的第0项将保存正则表达式匹配的文本。回答得很好。我正要写些类似的东西。我要补充的唯一一件事是,当您与外部实体(如输入字段)或来自emacs的mozrepl连接(发送UTF-8数据的服务器),甚至可能是使用UTF-8编码的javascript源代码本身进行交互时,UTF-8编码会显示出来。发生这种情况时,您将字符串解码为本机UTF-16字符串,对其进行操作,并在再次与外部实体接口之前重新编码回UTF-8。
var bytes= unescape(encodeURIComponent(chars)).slice(0, 400);
while (bytes.length>0) {
    try {
        chars= decodeURIComponent(escape(bytes));
        break
    } catch (e) {
        bytes= bytes.slice(0, -1);
    }
}