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 因为 UTF8 是 ASCII 的超集.通过阅读 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
为:
不确定这是否正是问题所在,但我试图在 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 因为 UTF8 是 ASCII 的超集.通过阅读 http://nedbatchelder.com/text/unipain.html
,您可以更好地理解 Unicode 的工作原理和 PythonPython 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
为: