【问题标题】:Python: Correct Way to refer to index of unicode stringPython:引用 unicode 字符串索引的正确方法
【发布时间】:2016-08-30 14:17:36
【问题描述】:

不确定这是否正是问题所在,但我试图在 unicode 字符串的第一个字母上插入一个标签,但似乎这不起作用。这可能是因为 unicode 索引的工作方式与常规字符串的不同吗?

现在我的代码是这样的:

for index, paragraph in enumerate(intro[2:-2]):
    intro[index] = bold_letters(paragraph, 1)

def bold_letters(string, index):
    return "<b>"+string[0]+"</b>"+string[index:]

我得到这样的输出:

<b>?</b>?רך האחד וישתבח הבורא בחכמתו ורצונו כל צבא השמים ארץ וימים אלה ואלונים. 

当我尝试插入 HTML 标记时,似乎 unicode 被弄乱了。我尝试弄乱插入位置,但没有任何进展。

所需输出示例(希伯来语从右到左):

>>>first_letter_bold("הקדמה")
"הקדמ<\b>ה<b>"

顺便说一句,这是针对 Python 2 的

【问题讨论】:

  • 你需要提到Python版本。在 Python 2.0 中,字符串是原始字符串,而 Python 3.0 中是 Unicode。 Python 3.0 具有相当于 Python 2.0 字符串的字节。
  • 这是使用python 2

标签: python unicode python-2.x


【解决方案1】:

你是对的,当你处理原始字节时,索引会在每个byte上工作,即Python(2.x)中的String

要无缝处理 Unicode 数据,您需要首先让 Python(2.x) 知道您正在处理 Unicode,然后进行字符串操作。您最终可以将其转换回原始字节以保持行为抽象化,即您获得 String 并返回 String

理想情况下,您应该在开始时将所有数据从UTF8 原始编码转换为Unicode 对象(我假设您的源编码是Unicode UTF8,因为这是当今大多数应用程序使用的标准)代码并在代码末尾转换回原始字节,例如保存到数据库、响应客户端等。某些框架可能会为您处理这些,因此您不必担心。

def bold_letters(string, index):
    string = string.decode('utf8')
    string "<b>"+string[0]+"</b>"+string[index:]
    return string.encode('utf8')

这也适用于 ASCII,因为 UTF8ASCII 的超集。通过阅读http://nedbatchelder.com/text/unipain.html

,您可以更好地了解 Unicode 的工作原理,尤其是在 Python 中

Python 3.x String 是一个 Unicode 对象,因此您无需显式执行任何操作。

【讨论】:

    【解决方案2】:

    您应该使用 Unicode 字符串。 UTF-8 中的字节字符串每个字符使用可变数量的字节。 Unicode 使用一个(至少在 Python 2 上的 BMP 中的那些......前 65536 个字符):

    #coding:utf8
    s = u"הקדמה"
    t = u'<b>'+s[0]+u'</b>'+s[1:]
    print(t)
    with open('out.htm','w',encoding='utf-8-sig') as f:
        f.write(t)
    

    输出:

    <b>ה</b>קדמה
    

    但我的 Chrome 浏览器将out.htm 显示为:

    【讨论】:

    • 也许它理解希伯来语是从左到右的?! OP提到了类似的东西。
    • @Nishant 我并不怀疑结果,但表明 OP 对字符串内容的期望不同,但期望的结果对于希伯来语来说是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多