我遇到了很多从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.索引也将从一种语言转移到另一种语言。
答案 0 :(得分:2)
您可能希望在此处根据此答案使用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字符:< / p>
#!/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)