根据您的经验,到目前为止,哪些Unicode字符,代码点,BMP(基本多语言平面)之外的范围是最常见的?这些是需要UTF-8中的4个字节或UTF-16中的代理项.
我希望答案是在名称中使用的中文和日文字符,但不包括在最广泛的CJK多字节字符集中,但在我最常用的项目上,英文维基词典,我们发现哥特字母是到目前为止更为常见.
UPDATE
我写了几个软件工具来扫描整个维基百科上的非BMP字符,我惊讶地发现,即使在日语维基百科中,哥特字母也是最常见的.在中文维基百科中也是如此,但它也有许多中文字符被使用多达50或70次,包括"",""和"".
BMP是基本的多语言平面
根据JavaScript:好的部分:
JavaScript是在16位字符集的时候构建的,因此JavaScript中的所有字符都是16位宽.
这让我相信JavaScript使用UCS-2(不是UTF-16!)并且只能处理U + FFFF以前的字符.
进一步调查证实了这一点:
> String.fromCharCode(0x20001);
Run Code Online (Sandbox Code Playgroud)
fromCharCode返回Unicode字符时,该方法似乎只使用最低16位.试图获得U + 20001(CJK统一表意文字20001)而不是返回U + 0001.
问题:是否可以在JavaScript中处理后BMP字符?
2011-07-31:来自Unicode支持Shootout的第 12个幻灯片:好的,坏的,以及(大部分)Ugly很好地解决了与此相关的问题:

更新了问题¹
关于字符类,比较,排序,规范化和排序规则,哪些.NET平台支持哪些Unicode版本?
原始问题
我记得有点模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,但实际上使用的是UCS-2,这是不一样的.例如,似乎U + FFFF以上的字符是不可能的,即考虑:
string s = "\u1D7D9"; // ("Mathematical double-struck digit one")
Run Code Online (Sandbox Code Playgroud)
它存储字符串"?9".
我基本上是在寻找以下答案的确切参考:
¹)我随着时间的推移更新了问题,对于答案和更大的社区来说似乎更合适.我留下原来的问题来代替评论中回答了哪些部分.在现有的32位Windows版本中也使用了旧的UCS-2(没有代理),.NET一直在内部使用UTF-16(带有代理).
我有一个字符范围限制列表,我需要检查字符串,但char.NET中的类型是UTF-16,因此一些字符变为古怪(代理)对.因此,当枚举a中的所有char's时string,我没有获得32位Unicode代码点,并且某些与高值的比较失败.
我非常了解Unicode,如果有必要,我可以自己解析字节,但我正在寻找一个C#/ .NET Framework BCL解决方案.所以......
如何将a转换为32位Unicode代码点string的数组(int[])?
如何在java中的unicode Basic Multilingual Plane外部匹配字符(有意删除它们)?
我需要从unicode charcode中获取字符串/ char,最后将其放入DOM TextNode中,以使用客户端JavaScript添加到HTML页面中.
目前,我正在做:
String.fromCharCode(parseInt(charcode, 16));
Run Code Online (Sandbox Code Playgroud)
其中charcode是包含charcode的十六进制字符串,例如"1D400".应该返回的unicode字符是, but a ?返回了!按预期返回16位范围(0000... FFFF)中的字符.
有任何解释和/或修改建议吗?
提前致谢!
如何在Java中使用char显示U + FFFF上方的Unicode字符?
我需要这样的东西(如果它是有效的):
char u = '\u+10FFFF';
Run Code Online (Sandbox Code Playgroud) 来自Core Java,第一卷.第1版,第9版,p.69:
字符ℤ需要两个UTF-16编码的代码单元.调用
Run Code Online (Sandbox Code Playgroud)String sentence = "? is the set of integers"; // for clarity; not in book char ch = sentence.charAt(1)不返回空格而是返回second的第二个代码单元.
但它似乎sentence.charAt(1) 确实返回了一个空间.例如,if以下代码中的语句求值为true.
String sentence = "? is the set of integers";
if (sentence.charAt(1) == ' ')
System.out.println("sentence.charAt(1) returns a space");
Run Code Online (Sandbox Code Playgroud)
为什么?
我在Ubuntu 12.10上使用JDK SE 1.7.0_09,如果它是相关的.
有没有人知道如何在谷歌v8中渲染unicode'星界'字符(其CID超出0xffff),javascript vm驱动谷歌chrome和nodejs?
有趣的是,当我给谷歌chrome(它标识为11.0.696.71,在ubuntu 10.4上运行)这样的html页面时:
<script>document.write( "helo" )
document.write( " ??" );
</script>
Run Code Online (Sandbox Code Playgroud)
它将正确地呈现'宽'字符和'窄'字符,但是当我在nodejs(使用console.log())中尝试等效时,我得到一个'宽'字符的单个 (0xfffd,REPLACEMENT CHARACTER).
我也被告知,无论出于何种不可理解的原因,谷歌都决定使用16位宽的数据类型来实现字符.虽然我觉得这很愚蠢,但代理码点的设计恰恰是为了通过16位挑战的路径实现"星际代码点"的"引导".并且不知何故,运行在chrome 11.0.696.71内部的v8似乎使用了这一点unicode-foo或其他魔法来完成它的工作(我好像记得几年前我总是有盒子而不是静态页面).
啊,是的,node --version报道v0.4.10,要弄清楚如何从中获取v8版本号.
更新我在咖啡脚本中做了以下事情:
a = String.fromCharCode( 0xd801 )
b = String.fromCharCode( 0xdc00 )
c = a + b
console.log a
console.log b
console.log c
console.log String.fromCharCode( 0xd835, 0xdc9c )
Run Code Online (Sandbox Code Playgroud)
但这只会给我
???
???
??????
??????
Run Code Online (Sandbox Code Playgroud)
这背后的想法是,因为处理unicode的javascript规范的脑谜部分似乎是强制性的吗?/不是彻头彻尾的禁止?/允许?使用代理对,那么也许我的源文件编码(utf-8)可能是问题的一部分.毕竟,在utf-8中有两种编码32位码点的方法:一种是写出第一个代理所需的utf-8个八位字节,然后是第二个代码点.另一种方式(根据utf-8规范,这是首选方式)是计算得到的代码点并写出该代码点所需的八位字节.所以在这里我完全排除源文件编码的问题,只处理数字.上面的代码确实可以document.write()在chrome中使用, so i know i got the numbers right.
sigh.
EDIT i did some experiments and found …
问题描述:
Mathematica
"\:nnnn"
用作unicode输入的语法.例如,如果我们进入
"\:6c34",我们得到"?"(中文"水").但如果有人想进入"\:1f618"(面对投掷一个吻)会怎样.当我尝试这个时,我得到了"?8",而不是"a face throwing a kiss".所以,Mathematica "\:1f61"在我进入之前进行了评估"8".
问题: 我们如何延迟此评估或如何输入任何unicode输入(对于超过4个字符的十六进制)?
软件和硬件平台: 我在Intel Mac上运行Mathematica 8.我尝试了Mathematica和Mathematica笔记本的命令行版本,它们的行为相同.
谢谢.
思考: Unicode是一个可扩展的标准,它可以增长(它确实增长:)).实现此标准的软件系统可能只实现此标准的子集,以便有效且有用(8位,16位或32位编码).一,作为某个软件包的用户,不应该假设一旦软件说它支持unicode,它就支持通用的unicode集.