我有很多从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#。
问题是:有没有办法确保字符串索引和长度是相同的?是否可以像在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。索引也将从一种语言移到另一种语言。
发布于 2017-12-19 03:37:06
您可能希望在下面的答案中使用StringInfo类:为什么这个字符串的长度比它中的字符数长?
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)https://stackoverflow.com/questions/47879399
复制相似问题