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

问题描述 投票:1回答:1

我从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.索引也将从一种语言关闭到另一种语言。

c# python python-3.x unicode
1个回答
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字符:

#!/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)
© www.soinside.com 2019 - 2024. All rights reserved.