Javascript 拉丁字符检查

Javascript 拉丁字符检查,javascript,regex,unicode,character-properties,Javascript,Regex,Unicode,Character Properties,也有一些类似的问题,但没有一个是完全相同的,或者有一个适合我的答案 我需要一个javascript函数来验证一个文本字段是否包含所有有效的拉丁字符,这样就不需要中文,只需要拉丁字符;具体而言: 基本拉丁语(不包括C0控制字符),拉丁语-1(不包括 C1控制字符),拉丁扩展A、拉丁扩展B和 拉丁语扩展了附加语。此集合对应于Unicode代码点 U+0020至U+007E,U+00A0至U+024F,U+IE00至U+IEFF 有些答案似乎检查了文本字段中的第一个字符,但漏掉了其他字符,因此这些答案

也有一些类似的问题,但没有一个是完全相同的,或者有一个适合我的答案

我需要一个javascript函数来验证一个文本字段是否包含所有有效的拉丁字符,这样就不需要中文,只需要拉丁字符;具体而言:

基本拉丁语(不包括C0控制字符),拉丁语-1(不包括 C1控制字符),拉丁扩展A、拉丁扩展B和 拉丁语扩展了附加语。此集合对应于Unicode代码点 U+0020至U+007E,U+00A0至U+024F,U+IE00至U+IEFF

有些答案似乎检查了文本字段中的第一个字符,但漏掉了其他字符,因此这些答案是不好的

这是我迄今为止尝试过的(这不起作用!):

以下类型的作品,但仅适用于第一个角色:

//var re = '\u0000-\u007F|\u0100-\u017F|\u0180-\u024F|\u1E00-\u1EFF|\u0080-\u00FF'; // latin regexp string
// couldn't get the above to work so using the following:
var re = '\\w+';
if (!value.match(re)) {
    message = 'Please enter valid latin characters only';
    $focusField = $this;
}
正确的方法是什么

我真的需要代码,而不是解释,但两者都会更好


谢谢

一种可行的方法:

if (/[^\u0020-\u007F\u00A0-\u024F\u1E00-\u1EFF]/.test(value)) {
    // non latin characters found
}

正则表达式测试
\u0020-\u007F
\u00A0-\u024F
\u1E00-\u1EFF
组的
[]
集合中不属于
^
的字符。

编辑:请注意,接受答案中给出的解决方案不正确。它充满了假阳性和假阴性。本文底部给出了所需的精确数字代码点编号

问题给出的示例错误地尝试使用块而不是脚本属性

您不想在此处使用Unicode块字符属性;您希望使用Unicode脚本字符属性。换句话说,您确实希望
Script=Latin
not尝试使用
Block=Basic\u-Latin
plus
Block=Latin\u-1
plus
Block=Latin\u-Extended\u-A
plus
Block=Latin\u-Extended\u-Additional

还要注意的是,这个问题被其他拉丁语块忽略了:
Block=Latin\u Extended\u C
Block=Latin\u Extended\u D

即使使用了正确的块,这些块中也会出现145个误报,但这些误报不是拉丁字符:

$unichars'\P{Script=Latin}'[\P{Block=Basic\u Latin}\P{Block=Latin\u 1}\P{Block=Latin\u 1\u Supplement}\P{Block=Latin\u Extended\u A}\P{Block=Latin\u Extended\u B}
\p{Block=Latin_Extended_Additional}\p{Block=Latin_Extended_C}\p{Block=Latin_Extended_D}]'| wc-l
145
此外,您可能会错过403个错误否定,这些错误否定实际上是拉丁文字字符,但不在这些块中:

$unichars'\p{Script=Latin}'[^\p{Block=Basic\u-Latin}\p{Block=Latin\u 1}\p{Block=Latin\u-1\u-Supplement}\p{Block=Latin\u-Extended\u-A}\p{Block=Latin\u-Extended\u-B
}\p{Block=Latin_Extended_Additional}\p{Block=Latin_Extended_C}\p{Block=Latin_Extended_D}]'| wc-l
403
你几乎从不想使用块;您想要使用脚本。这就是为什么UTS#18的1级一致性要求支持脚本字符属性,但在之前没有提到块属性

有关使用块而不是脚本的更多陷阱,请参见

由于Javascript错误导致无法按范围指定这些代码点,因此删除了位于基本多语言平面之外的代码点,我们只剩下这组难以维护的garbledy gook,需要它来查找所有Unicode v6.2代码点,这些代码点具有拉丁、通用、,或继承的脚本字符属性:

[\u0000-\u0040][\u0041-\u005A][\u005B-\u0060][\u0061-\u007A][\u007B-\u00A9]\u00AA[\u00AB-\u00B9]\u00BA[\u00BB-\u00BF][\u00C0-\u00D6]\u00D7[\u00D8-\u00
F6]\u00F7[\u00F8-\u02B8][\u02B9-\u02DF][\u02E0-\u02E4][\u02E5-\u02E9][\u02EC-\u02FF][\u0300-\u036F]\u0374\u037E\u0385\u0387[\u0485-\u0486]\u0589\u060C
\u061B\u061F\u0640[\u064B-\u0655][\u0660-\u0669]\u0670\u06DD[\u0951-\u0952][\u0964-\u0965]\u0E3F[\u0FD5-\u0FD8]\u10FB[\u16EB-\u16ED][\u1735-\u1736][\u
1802-\u1803]\u1805[\u1CD0-\u1CD2]\u1CD3[\u1CD4-\u1CE0]\u1CE1[\u1CE2-\u1CE8][\u1CE9-\u1CEC]\u1CED[\u1CEE-\u1CF3]\u1CF4[\u1CF5-\u1CF6][\u1D00-\u1D25][\u
1D2C-\u1D5C][\u1D62-\u1D65][\u1D6B-\u1D77][\u1D79-\u1DBE][\u1DC0-\U1D6][\u1DFC-\u1DFF][\u1E00-\u1EFF][\u2000-\u200B][\u200C-\u200D][\u200E-\u2064][\u
206A-\u2070]\u2071[\u2074-\u207E]\u207F[\u2080-\u208E][\u2090-\u209C][\u20A0-\u20BA][\u20D0-\u20F0][\u2100-\u2125][\u2127-\u2129][\u212A-\u212B][\u212
C-\u2131]\u2132[\u2133-\u214D]\u214E[\u214F-\u215F][\u2160-\u2188]\u2189[\u2190-\u23F3][\u2400-\u2426][\u2440-\u244A][\u2460-\u26FF][\u2701-\u27FF][\u
2900-\u2B4C][\u2B50-\u2B59][\u2C60-\u2C7F][\u2E00-\u2E3B][\u2FF0-\u2FFB][\u3000-\u3004]\u3006[\u3008-\u3020][\u302A-\u302D][\u3030-\u3037][\u303C-\u30
3F][\u3099-\u309A][\u309B-\u309C]\u30A0[\u30FB-\u30FC][\u3190-\u319F][\u31C0-\u31E3][\u3220-\u325F][\u327F-\u32CF][\u3358-\u33FF][\u4DC0-\u4DFF][\uA70
0-\uA721][\uA722-\uA787][\uA788-\uA78A][\uA78B-\uA78E][\uA790-\uA793][\uA7A0-\uA7AA][\uA7F8-\uA7FF][\uA830-\uA839][\uFB00-\uFB06][\uFD3E-\uFD3F]\uFDFD
[\uFE00-\uFE0F][\uFE10-\uFE19][\uFE20-\uFE26][\uFE30-\uFE52][\uFE54-\uFE66][\uFE68-\uFE6B]\uFEFF[\uFF01-\uFF20][\uFF21-\uFF3A][\uFF3B-\uFF40][\uFF41-\
uFF5A][\uFF5B-\uFF65]\uFF70[\uFF9E-\uFF9F][\uFFE0-\uFFE6][\uFFE8-\uFFEE][\uFFF9-\uFFFD]
就我个人而言,我会解雇任何试图使用这种胡说八道的人

此外,在处理完整Unicode时,由于Javascript错误而遗漏的3225个代码点如下:

10100-10102 10107-10133 10137-1013F 10190-1019B 101D0-101FC 101FD
1D000-1D0F5 1D100-1D126 1D129-1D166 1D167-1D169 1D16A-1D17A 1D17B-1D182
1D183-1D184 1D185-1D18B 1D18C-1D1A9 1D1AA-1D1AE-1D1D300-1D356
1D360-1D371 1D400-1D454 1D456-1D49C 1D49E-1D49F 1D4A2 1D4A5-1D4A6
1D4A9-1D4AC 1D4AE-1D4B9 1D4BB 1D4BD-1D4C3 1D4C5-1D505 1D507-1D50A
1D50D-1D514 1D516-1D51C 1D51E-1D539
if (/[^\u0020-\u007F\u00A0-\u024F\u1E00-\u1EFF]/.test(value)) {
    // non latin characters found
}
[^\p{Script=Latin}\p{Script=Common}\p{Script=Inherited}]
XRegExp("[^\\p{Latin}\\p{Common}\\p{Inherited}]");
/^[A-z\u00C0-\u00ff\s'\.,-\/#!$%\^&\*;:{}=\-_`~()]+$/
var regexp = /[A-z\u00C0-\u00ff]+/g,
  ascii = ' hello !@#$%^&*())_+=',
  latin = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏàáâãäåæçèéêëìíîïÐÑÒÓÔÕÖØÙÚÛÜÝÞßðñòóôõöøùúûüýþÿ',
  chinese = ' 你 好 ';

console.log(regexp.test(ascii)); // true
console.log(regexp.test(latin)); // true
console.log(regexp.test(chinese)); // false