我可以在Python3中使用不同的代码点吗?

时间:2017-12-19 02:56:02

标签: c# python python-3.x unicode

我遇到了很多从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.索引也将从一种语言转移到另一种语言。

1 个答案:

答案 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)