我从C#到python有很多字符串索引问题。基本上,现有的数据管道(在C#中)为python模型生成一些字符串索引。发生的事情是这两种语言在各自的unicode系统中使用不同的代码点,如下所述:http://illegalargumentexception.blogspot.com/2010/04/i18n-comparing-character-encoding-in-c.html
因此,C#中的字符串长度和索引(16位,隐式utf-16)在Python(16或32)中不是100%相关的。有时,如果字符大于0xFFFF(大于16位),Python会生成比C#更小的字符串长度。
问题是:有没有办法确保字符串索引和长度相同?是否有可能强制执行Python在C#中使用隐式16位?
一个具体的例子是这样的:
𐤑𐤅𐤓, Ṣur
它的utf-8字节:
b'\xf0\x90\xa4\x91\xf0\x90\xa4\x85\xf0\x90\xa4\x93, \xe1\xb9\xa2ur'
在Python中,此字符串的长度为12,其中C#报告为15.索引也将从一种语言关闭到另一种语言。
您可能希望在此处使用StringInfo类:Why is the length of this string longer than the number of characters in it?
using System;
using System.Text;
using System.Globalization;
namespace StackOverflow {
class Program {
public static void Main(string[] args) {
var s = "𐤑𐤅𐤓, Ṣur";
// Len == 11
Console.WriteLine("{0}: {1}", s, s.Length);
// len == 8
var si = new StringInfo(s);
Console.WriteLine("{0}: {1}", s, si.LengthInTextElements);
}
}
}
或者,在Python方面,您可以尝试这一点,但它与C#的长度并不完全相同,因为它假定为2个字节,因此它仅涵盖前65,536个UTF-16字符:
#!/usr/bin/env python3
s = "𐤑𐤅𐤓, Ṣur"
# len == 8 (displayable len)
print("{}: {}".format(s, len(s)))
# len == 11 (C# wackiness)
print(int(len(s.encode("utf-16")) / 2) - 1)