如何判断字符串中是不是包含任何非 ASCII 字符?

Posted

技术标签:

【中文标题】如何判断字符串中是不是包含任何非 ASCII 字符?【英文标题】:How can I tell if a string has any non-ASCII characters in it?如何判断字符串中是否包含任何非 ASCII 字符? 【发布时间】:2012-11-11 10:43:16 【问题描述】:

我希望检测电子邮件地址中的国际化域名和本地部分,并想知道是否有一种使用正则表达式或其他 javascript 的快速简便的方法来执行此操作。

【问题讨论】:

ASCII 是什么意思?请记住,NUL (\0)、BEL (\7 - 导致 PC 发出哔哔声)、ESC (\033) 也是有效的 ASCII 字符,但大多数人不会认为它们是有效的 ASCII 文本。 @slebetman 非常公平的补充。 【参考方案1】:

应该这样做...

var hasMoreThanAscii = /^[\u0000-\u007f]*$/.test(str);

...还有...

var hasMoreThanAscii = str
                       .split("")
                       .some(function(char)  return char.charCodeAt(0) > 127 );

ES6 天哪...

let hasMoreThanAscii = [...str].some(char => char.charCodeAt(0) > 127);

【讨论】:

+ 不应该是* 吗?这要求字符串中包含字符,但空字符串 "" 满足 OP 的严格要求:其中没有任何非 ASCII 字符。 如果你把.filter改成.some,就可以去掉.length > 0 @user1689607 是的。我还将摆脱一些浏览器支持;) 不,任何支持.filter()的浏览器都支持.some()。它们都是 ES5 的补充。 :) 变量名倒置。 /^[\u0000-\u007f]*$/.test(str) = true 当 ascii 所以变量名应该是: var isAscii = /^[\u0000-\u007f]*$/.test(str)【参考方案2】:

试试这个正则表达式。它测试字符串中所有 具有某种意义的 ascii 字符,从空格 32 到波浪号 126

var ascii = /^[ -~]+$/;

if ( !ascii.test( str ) ) 
  // string has non-ascii characters

编辑:带有制表符和换行符:

/^[ -~\t\n\r]+$/;

【讨论】:

所以制表符和换行符不算是 OK 字符? @JonathanLeffler:对...我也添加了那个案例。 @elclanrs 不过,我很高兴你有所区别,因为对于许多用例来说,它们是不受欢迎的。 所有 Ascii 字符都有含义,但并非所有字符都允许或适用于特定上下文。变量名ascii 在这里会产生误导。【参考方案3】:

charCodeAt可用于获取字符串中某个位置的字符代码。

function isAsciiOnly(str) 
    for (var i = 0; i < str.length; i++)
        if (str.charCodeAt(i) > 127)
            return false;
    return true;

【讨论】:

最大的ASCII字符不是127吗? 我相信现在最大的 ASCII 码是 255 在这里查看ascii-code.com【参考方案4】:

@alex's solution 的更简单替代方案:

const hasNonAsciiCharacters = str => /[^\u0000-\u007f]/.test(str);

【讨论】:

以上是关于如何判断字符串中是不是包含任何非 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章

判断字符串中是不是含有中文

oracle sql 判断 字段是不是是汉字

一句话判断字符串中是不是有汉字

c#怎么判断字符串中包含汉字?

如何检测字符串中的非 ASCII 字符?

信用卡验证:卡名可以包含非 ASCII 字符吗?