首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从.NET字符串中获取Unicode代码点的数组?

如何从.NET字符串中获取Unicode代码点的数组?
EN

Stack Overflow用户
提问于 2009-03-26 20:03:46
回答 3查看 5.6K关注 0票数 21

我有一个需要检查字符串的字符范围限制列表,但是.NET中的char类型是UTF-16,因此一些字符变成了奇怪的(代理)对。因此,当枚举string中的所有char时,我得不到32位Unicode代码点,并且一些高值的比较失败。

我对Unicode非常了解,如果需要,我可以自己解析字节,但我正在寻找一种C#/.NET Framework BCL解决方案。所以..。

如何将string转换为32位Unicode代码点的数组(int[])?

EN

回答 3

Stack Overflow用户

发布于 2015-01-27 02:11:49

看起来不应该比这复杂得多:

代码语言:javascript
复制
public static IEnumerable<int> Utf32CodePoints( this IEnumerable<char> s )
{
  bool      useBigEndian = !BitConverter.IsLittleEndian;
  Encoding  utf32        = new UTF32Encoding( useBigEndian , false , true ) ;
  byte[]    octets       = utf32.GetBytes( s ) ;

  for ( int i = 0 ; i < octets.Length ; i+=4 )
  {
    int codePoint = BitConverter.ToInt32(octets,i);
    yield return codePoint;
  }

}
票数 4
EN

Stack Overflow用户

发布于 2016-07-19 22:10:27

我想出了尼古拉斯(和杰普)建议的same approach,只是更短:

代码语言:javascript
复制
    public static IEnumerable<int> GetCodePoints(this string s) {
        var utf32 = new UTF32Encoding(!BitConverter.IsLittleEndian, false, true);
        var bytes = utf32.GetBytes(s);
        return Enumerable.Range(0, bytes.Length / 4).Select(i => BitConverter.ToInt32(bytes, i * 4));
    }

枚举是我所需要的全部,但是获得一个数组是很简单的:

代码语言:javascript
复制
int[] codePoints = myString.GetCodePoints().ToArray();
票数 0
EN

Stack Overflow用户

发布于 2020-06-12 14:44:08

此解决方案产生与the solution by Daniel A.A. Pelsmaeker相同的结果,但更短一些:

代码语言:javascript
复制
public static int[] ToCodePoints(string s)
{
    byte[] utf32bytes = Encoding.UTF32.GetBytes(s);
    int[] codepoints = new int[utf32bytes.Length / 4];
    Buffer.BlockCopy(utf32bytes, 0, codepoints, 0, utf32bytes.Length);
    return codepoints;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/687359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档