Python:引用 unicode 字符串索引的正确方法

Python: Correct Way to refer to index of unicode string

不确定这是否正是问题所在,但我试图在 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

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

要无缝处理 Unicode 数据,您首先需要让 Python(2.x) 知道您正在处理 Unicode ,然后进行字符串操作。您最终可以将其转换回原始字节以保持抽象的行为,即您得到 String 并且您 return 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 对象,所以你不必明确地做任何事情。

您应该使用 Unicode 字符串。 UTF-8 中的字节字符串每个字符使用可变数量的字节。 Unicode 使用一个(至少 BMP 中的 Python 2...前 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 为: