首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在Python3中使用不同的代码点吗?

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

Stack Overflow用户
提问于 2017-12-19 02:56:02
回答 1查看 63关注 0票数 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#。

问题是:有没有办法确保字符串索引和长度是相同的?是否可以像在C#中那样强制使用隐含的16位呢?

一个具体的例子是:

代码语言:javascript
复制
, Ṣur

以及它的utf-8字节:

代码语言:javascript
复制
b'\xf0\x90\xa4\x91\xf0\x90\xa4\x85\xf0\x90\xa4\x93, \xe1\xb9\xa2ur'

在Python中,这个字符串的长度为12,正如C#报告的15。索引也将从一种语言移到另一种语言。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 03:37:06

您可能希望在下面的答案中使用StringInfo类:为什么这个字符串的长度比它中的字符数长?

代码语言:javascript
复制
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字符:

代码语言:javascript
复制
#!/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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47879399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档