能否遍历所有 Unicode 字符(UTF-8)?谢谢! 我已经尝试使用:
character = String.fromCharCode(i);
但是我不确定如何实现它。
能否遍历所有 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));
}
(添加此答案是因为与某些谷歌搜索相关)
遍历可能包含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
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);
}
''.length
为例试试看。 - trincot
for
循环里,遍历所有可能的i
值。 - BarmarfromCharCode()
会返回字符。 - Barmar