Unicode Javascript - 需要向用户显示无效字符
Unicode Javascript - Need to display invalid characters back to user
我正在寻找能够解决以下问题的解决方案,但我对 Unicode 的经验有限。
基本上用户可以在文本字段中输入内容,但是当他们提交时,我想显示一个符合 WEREN"T GSM 的字符列表。即所有符合没有 0-127 的字符代码。
但是,当您将表情符号混入其中时,它会严重中断,因为如果我将其字符化,一些表情符号字符将被分解,并且会显示验证失败的错误原因。
I.E "".length = 2,它将被分成 2 个字符,因此当我告诉用户失败的原因时,他们会得到错误的原因。
任何关于我如何解决这个问题的想法都将不胜感激。
编辑:不能使用 ES6 并且需要一个无效字符数组
有意思!这只是反复试验,但看起来使用 Array.from
将字符串转换为 chars 字符串数组将允许您正确索引字符:
Array.from('').length
1
Array.from('abc').length
4
Array.from('abc')[0]
""
假设您正在使用这样的正则表达式来查找不在有效范围内的字符:
/[^[=10=]-\x7f]/
你可以修改它来匹配UTF-16 surrogate pairs:
/[\ud800-\udbff][\udc00-\udfff]|[^[=11=]-\x7f]/
在现代浏览器上,您也可以只使用 u
标志直接对 Unicode 代码点进行操作:
/[^[=12=]-\x7f]/u
这仍然只会得到代码点,而不是字形簇(对于组合字符、现代组合表情符号、肤色和所有语言的一般正确性很重要)。那些更难处理。什么时候(如果?)browser support appears, they will be less hard; until then, a dedicated package 是您最好的选择。
var NON_GSM_CODEPOINT = /[\ud800-\udbff][\udc00-\udfff]|[^[=13=]-\x7f]/;
var input = document.getElementById('input');
input.addEventListener('input', function () {
var match = this.value.match(NON_GSM_CODEPOINT);
this.setCustomValidity(match ? 'Invalid character: “' + match[0] + '”' : '');
this.form.reportValidity();
});
<form>
<textarea id="input"></textarea>
</form>
可以使用展开运算符(...
)将字符拆分成一个数组,然后charCodeAt
得到值:
let str = `abcdefghi`;
let chars = [...str];
console.log(`All Chars: ${chars}`);
console.log('Bad Chars:',
chars.filter(v=>v.charCodeAt(0)>127)
);
我正在寻找能够解决以下问题的解决方案,但我对 Unicode 的经验有限。
基本上用户可以在文本字段中输入内容,但是当他们提交时,我想显示一个符合 WEREN"T GSM 的字符列表。即所有符合没有 0-127 的字符代码。
但是,当您将表情符号混入其中时,它会严重中断,因为如果我将其字符化,一些表情符号字符将被分解,并且会显示验证失败的错误原因。
I.E "".length = 2,它将被分成 2 个字符,因此当我告诉用户失败的原因时,他们会得到错误的原因。
任何关于我如何解决这个问题的想法都将不胜感激。
编辑:不能使用 ES6 并且需要一个无效字符数组
有意思!这只是反复试验,但看起来使用 Array.from
将字符串转换为 chars 字符串数组将允许您正确索引字符:
Array.from('').length
1
Array.from('abc').length
4
Array.from('abc')[0]
""
假设您正在使用这样的正则表达式来查找不在有效范围内的字符:
/[^[=10=]-\x7f]/
你可以修改它来匹配UTF-16 surrogate pairs:
/[\ud800-\udbff][\udc00-\udfff]|[^[=11=]-\x7f]/
在现代浏览器上,您也可以只使用 u
标志直接对 Unicode 代码点进行操作:
/[^[=12=]-\x7f]/u
这仍然只会得到代码点,而不是字形簇(对于组合字符、现代组合表情符号、肤色和所有语言的一般正确性很重要)。那些更难处理。什么时候(如果?)browser support appears, they will be less hard; until then, a dedicated package 是您最好的选择。
var NON_GSM_CODEPOINT = /[\ud800-\udbff][\udc00-\udfff]|[^[=13=]-\x7f]/;
var input = document.getElementById('input');
input.addEventListener('input', function () {
var match = this.value.match(NON_GSM_CODEPOINT);
this.setCustomValidity(match ? 'Invalid character: “' + match[0] + '”' : '');
this.form.reportValidity();
});
<form>
<textarea id="input"></textarea>
</form>
可以使用展开运算符(...
)将字符拆分成一个数组,然后charCodeAt
得到值:
let str = `abcdefghi`;
let chars = [...str];
console.log(`All Chars: ${chars}`);
console.log('Bad Chars:',
chars.filter(v=>v.charCodeAt(0)>127)
);