我有一个需要检查字符串的字符范围限制列表,但是.NET中的char
类型是UTF-16,因此一些字符变成了奇怪的(代理)对。因此,当枚举string
中的所有char
时,我得不到32位Unicode代码点,并且一些高值的比较失败。
我对Unicode非常了解,如果需要,我可以自己解析字节,但我正在寻找一种C#/.NET Framework BCL解决方案。所以..。
如何将string
转换为32位Unicode代码点的数组(int[]
)?
发布于 2015-01-27 02:11:49
看起来不应该比这复杂得多:
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;
}
}
发布于 2016-07-19 22:10:27
我想出了尼古拉斯(和杰普)建议的same approach,只是更短:
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));
}
枚举是我所需要的全部,但是获得一个数组是很简单的:
int[] codePoints = myString.GetCodePoints().ToArray();
发布于 2020-06-12 14:44:08
此解决方案产生与the solution by Daniel A.A. Pelsmaeker相同的结果,但更短一些:
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;
}
https://stackoverflow.com/questions/687359
复制相似问题