是否可以迭代所有 Unicode 字符 (UTF-8)?谢谢! 我尝试过使用:
character = String.fromCharCode(i);
但我不知道如何实施。
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 获取表格并提取您真正想要迭代的字符。
对可能包含 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/iteating-over-emoji-characters-the-es6-way-f06e4589516
根据文档,传递给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
for(var i = 0; i < str.length; i++) {
var char = str[i],
code = str.charCodeAt(i);
}