如何使用Javascript检查字符串中是否存在任何非ISO-8859-1字符?

10
我想在Javascript中编写一个字符串验证器(或正则表达式),用于ISO-8859-1字符。如果字符串中有任何非ISO-8859-1字符,则验证器必须返回false,否则返回true。例如:

我想在Javascript中编写一个字符串验证器(或正则表达式),用于ISO-8859-1字符。

如果字符串中有任何非ISO-8859-1字符,则验证器必须返回false,否则返回true。例如:

str = "abcÂÃ";
validator(str); // should return true;

str = "a 你 好";
validator(str); // should return false;

str ="你 好";
validator(str); // should return false;

我曾尝试使用以下正则表达式,但它并不完美地工作。

var regex = /^[\u0000-\u00ff]+/g;
var res = regex.test(value);
2个回答

9

如果您希望在存在 任何 非ISO-8859-1字符时返回false,则可以使用双重否定:

var str = "abcÂÃ";
console.log(validator(str)); // should return true;

str = "a 你 好";
console.log(validator(str)); // should return false;

str = "你 好";
console.log(validator(str)); // should return false;

str = "abc";
console.log(validator(str)); // should return true;

str = "╗";
console.log(validator(str)); // should return false;

function validator(str) {
  return !/[^\u0000-\u00ff]/g.test(str);
}

它使用 !/[^\u0000-\u00ff]/g.test(str),因为它检查是否有任何非字符,如果没有,则返回 true,否则返回 false

这是正确的正则表达式吗?我在 https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s08.html 找到了 ^[\x00-\x7F\xA0-\xFF]+$。这个正则表达式反映了你可以在 https://de.wikipedia.org/wiki/ISO_8859-1#ISO/IEC_8859-1 上找到的已删除字符。 - Icad
@Icad 这是因为这些正则表达式是 JavaScript 的,而你找到的那些不是。不同的编程语言之间会有一些差异。 - Thanh-Quy Nguyen
虽然理解了,但仍不符合指定范围u0000-\u00ff的要求,因为其中包含非ISO-8859-1控制字符(U+0080到U+009F)。 - Icad

0

如果您想要另一种选择...

ISO-8859-1 - 也称为“Latin 1” Unicode块 https://en.wikipedia.org/wiki/ISO/IEC_8859-1

因此,让我们尝试使用一些本地函数,该函数仅使用latin1输入...

Base64的设计预期其输入为二进制数据。就JavaScript字符串而言,这意味着每个字符仅占用一个字节的字符串。因此,如果您将包含占用多个字节的字符的字符串传递到btoa()中,您将收到错误,因为这不被视为二进制数据。 https://developer.mozilla.org/en-US/docs/Web/API/btoa

const validator = (str) => {
  try {
    btoa(str)
    return true;
  } catch () {
    return false;
  }
}

btoa会抛出以下错误:

未捕获的DOMException:在“Window”上执行“btoa”失败:要编码的字符串包含拉丁1范围之外的字符。 at :1:1

另请参阅:JavaScript存在Unicode问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接