use*_*248 1 c# unicode utf-16 utf-32
我有一个C#方法需要检索字符串的第一个字符,并查看它是否存在于包含特定unicode字符的哈希集中(所有从右到左的字符).
所以我在做
var c = str[0];
Run Code Online (Sandbox Code Playgroud)
然后检查hashset.
问题是这个代码不适用于第一个char的代码点大于65535的字符串.
我实际创建了一个循环,遍历0到70,000之间的所有数字(最高RTL代码点大约68,000,所以我向上舍入),我从数字创建一个字节数组,并使用
Encoding.UTF32.GetString(intValue);
Run Code Online (Sandbox Code Playgroud)
用这个字符创建一个字符串.然后我将它传递给在HashSet中搜索的方法,并且该方法失败,因为它何时获得
str[0]
Run Code Online (Sandbox Code Playgroud)
这个价值永远不会是应有的.
我究竟做错了什么?
A String是一系列UTF-16代码单元,一个或两个编码Unicode代码点.如果要从字符串中获取代码点,则必须迭代字符串中的代码点."字符"也是基本码点,后跟零个或多个组合码点的序列("组合字符").
// Use a HashSet<String>
var itor = StringInfo.GetTextElementEnumerator(s);
while (itor.MoveNext()) {
var character = itor.GetTextElement();
// find character in your HashSet
}
Run Code Online (Sandbox Code Playgroud)
如果您不需要考虑组合代码点,则可以将其擦除.(但在某些语言中它们非常重要.)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |