如何遍历所有Unicode字符?

7

能否遍历所有 Unicode 字符(UTF-8)?谢谢! 我已经尝试使用:

character = String.fromCharCode(i);

但是我不确定如何实现它。


把它放进一个for循环里,遍历所有可能的i值。 - Barmar
那么对于 charcode,它的格式是什么?像 x\00000 这样的吗? - Aero
那就是将其写成字面字符串的格式。但你不需要这样做,fromCharCode()会返回字符。 - Barmar
@Barmar,说起来容易做起来难,我来寻找可能值的限制和格式(十进制、十六进制或其他)进行迭代。 - revelt
5个回答

11

UTF-8是一种编码方式!JavaScript字符串(大多数情况下)采用UTF-16编码。编码只有在你的工作环境不支持ES6的String.fromCodePoint时才很重要。使用ES6从代码点获取字符串:

var s = String.fromCodePoint(codePoint);

如果没有使用ES6,对于U+10000及其之后的字符,需要使用UTF-16 代理对

var s;

if (codePoint < 0x10000) {
    s = String.fromCharCode(codePoint);
} else {
    var offset = codePoint - 0x10000;
    s = String.fromCharCode(0xd800 + (offset >> 10),
                            0xdc00 + (offset & 0x3ff));
}

代码点范围从U+0000到U+10FFFF(1,114,112个值),但并非该范围内的所有内容都是有效的Unicode字符。您可以从http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt获取一张表格,并提取您真正想要迭代的字符。

8

(添加此答案是因为与某些谷歌搜索相关)

遍历可能包含UTF-8多码点字符(如表情符号或非拉丁字母表)的字符串中的每个字符的正确方法是使用Array.from()

const bugs = ''

// WRONG, does not account for characters with > 2 Unicode code points
bugs.split('')
// Array(6) [ "\ud83d", "\udc1b", "\ud83d", "\udc1b", "\ud83d", "\udc1b" ]

// CORRECT
Array.from(bugs)
// Array(3) [ "", "", "" ]

然后,您可以像迭代普通数组一样迭代它(建议使用map/forEach)。

更多信息请参见:https://medium.com/@giltayar/iterating-over-emoji-characters-the-es6-way-f06e4589516


4
根据文档,传递给String.fromCharCode(a)的参数将通过调用ToUint16进行转换,然后返回该字符。您可以使用任何数字调用它,但这些值将被限制在0和216或232之间。
highNumber = 500; //This could go very high
out = ""
for(i=0;i<highNumber;i++){
    out += String.fromCharCode(i);
}
console.log(out);

注意危险 如果您使用 2^16 运行此代码,可能会导致您的标签页或浏览器冻结,这太大了。这意味着您要迭代所有字符而不是给定字符串中的所有字符,这是完全不同的事情。

更合理的 highNumber(即500)的示例输出如下:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
stuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæç
èéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺ
ĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍ
ƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠ
ǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdz

3
只是一个观察,这个问题只涉及到迭代,而不必要构建一个包含所有可能字符的新字符串。例如,我来这里寻找charcode值的最大限制。我计划只循环并进行比较。那么内存问题就不适用了。 - revelt

2

我认为这可能会明确定义要迭代的内容:

enter image description here


抱歉给你点了踩,虽然这个回答在技术上是正确的,但是太过于低级了! - caesarsol
1
仅仅因为其他人认为它太低级了,并不意味着我们中的一些人不欣赏那个图表...了解范围并获得比图表更好的形式是很棒的...已点赞...我宁愿两者都有,简单答案和复杂答案。这样人们就可以选择他们想要实现的级别。 - PerryCS

-3
JavaScript字符串具有length属性,您可以简单地迭代字符:
for(var i = 0; i < str.length; i++) {
    var char = str[i],
       code = str.charCodeAt(i);
}

1
这个答案不正确。即使两个16位“字符”构成一个代理对并表示一个字符,这段代码仍然会迭代它们。以''.length为例试试看。 - trincot

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