如何查找特定的字符串是否具有unicode字符(特别是双字节字符)

时间:2020-03-06 14:51:50  来源:igfitidea点击:

更确切地说,我需要知道是否(以及如果可能的话,如何)找到给定的字符串是否具有双字节字符。基本上,我需要打开一个弹出窗口以显示给定的文本,其中可以包含双字节字符,例如中文或者日语。在这种情况下,我们需要调整窗口大小,而不是调整英语或者ASCII窗口大小。
有人知道吗?

解决方案

为什么不让窗口根据运行时的高度/宽度来调整自身大小?

在弹出窗口中运行以下命令:

window.resizeTo(document.body.clientWidth, document.body.clientHeight);

实际上,至少从Java脚本引擎的角度来看,所有字符都是Unicode。

不幸的是,仅出现在特定Unicode范围内的字符不足以确定我们需要更多空间。有许多字符占用的空间与其他字符的空间大致相同,而其他字符的Unicode代码点则远高于ASCII范围。印刷报价,带变音符号的字符,某些标点符号和各种货币符号不在ASCII低范围内,并且在Unicode基本多语言平面上的不同位置分配。

通常,我从事的项目会选择为所有语言提供额外的空间,或者有时使用javascript来确定具有自动滚动条css属性的窗口实际上是否具有触发滚动条的高度。

如果检测到存在或者计数的CJK字符足以确定我们需要一些额外的空间,则可以使用以下范围构造一个正则表达式:
[\ u3300- \ u9fff \ uf900- \ ufaff],并使用它来提取匹配字符数的计数。 (这有点过于粗略,并且错过了所有非BMP的情况,可能排除了一些其他相关范围,并且很可能包括一些不相关的字符,但这是一个起点)。

再次,我们将只能管理粗略的试探法,而无需遵循全文渲染引擎的要求,因为我们真正想要的是类似于GDI的MeasureString(或者任何其他文本渲染引擎的等效项)。自从这样做以来已经有一段时间了,但是我认为最接近的HTML / DOM等效项是在div上设置宽度并请求高度(剪切和粘贴重用,因此如果其中包含错误,我们深表歉意):

o = document.getElementById("test");

document.defaultView.getComputedStyle(o,"").getPropertyValue("height"))

JavaScript在内部将文本保存为UCS-2,它可以对相当广泛的Unicode子集进行编码。

但这与问题并不完全相关。一种解决方案可能是遍历字符串并检查每个位置的字符代码:

function isDoubleByte(str) {
    for (var i = 0, n = str.length; i < n; i++) {
        if (str.charCodeAt( i ) > 255) { return true; }
    }
    return false;
}

这可能没有我们想要的快。

我在这个问题上使用了mikesamuel的答案。但是我注意到也许是因为这种形式,在u之前应该只有一个转义斜线,例如为了使此功能正常工作,请使用\ u而不是\\ u

function containsNonLatinCodepoints(s) {
    return /[^\u0000-\u00ff]/.test(s);
}

为我工作:)