使用 utf-8 的 .epub 转换的输出格式是错误的
Output format of an .epub conversion with utf-8 is bad
我想将 epub 文件从 .epub 写入 .txt 并只获取文本,我找到了一个库来完成它。
import epub_conversion
f = open("demofile.txt", "a")
book = open_book("razvansividra.epub")
lines = convert_epub_to_lines(book)
for line in lines:
f.writelines(str(line.encode("utf-8")))
一切都很好,但主要问题是输出格式如下:
Carte electronic\xc4\x83 publicat\xc4\x83 cu sprijinul Ministerului Afacerilor Externe \xe2\x80\x93 Departamentul Politici pentru Rela\xc8\x9bia cu Rom\xc3\xa2nii de Pretutindeni.'b' 'b'
'b''b''
那些像 "xc4" 这样的字符 我假设它们来自我的语言中的特殊字符,因为这本书是用我的语言写的。
您正在进行不必要的 encoding/decoding 往返。
查看这个小型互动会话:
>>> s = 'electronică'
>>> b = s.encode('utf-8')
>>> b
b'electronic\xc4\x83'
>>> str(b)
"b'electronic\xc4\x83'"
- 首先,你有一个字符串
s
,你对其进行编码 - 你会得到一个 bytes
对象(注意 b'...'
符号)。
- 然后您对其调用
str()
,它再次将其转换回字符串——但不是通过解码,而是通过使用额外的引号和转义序列。
- 当您调用
f.writelines()
时,该字符串在内部再次解码以将其写入磁盘。但是因为它都是 ASCII,所以最后一步并不明显。
您应该确保从一开始就使用正确的编码打开文件。
那么你就不必再使用 line.encode('utf-8')
。
因此:
f = open("demofile.txt", "w", encoding="utf-8")
然后:
f.writelines(lines)
请注意,如果您使用 writelines
,则无需执行 for line in lines
;它已经意味着与可迭代的行一起使用。
打开生成的文件时,请确保使用支持 UTF-8 的编辑器。
值得注意的是 "simple" Windows 记事本等工具通常无法正确显示 UTF-8 文件。
我想将 epub 文件从 .epub 写入 .txt 并只获取文本,我找到了一个库来完成它。
import epub_conversion
f = open("demofile.txt", "a")
book = open_book("razvansividra.epub")
lines = convert_epub_to_lines(book)
for line in lines:
f.writelines(str(line.encode("utf-8")))
一切都很好,但主要问题是输出格式如下:
Carte electronic\xc4\x83 publicat\xc4\x83 cu sprijinul Ministerului Afacerilor Externe \xe2\x80\x93 Departamentul Politici pentru Rela\xc8\x9bia cu Rom\xc3\xa2nii de Pretutindeni.'b' 'b'
'b''b''
那些像 "xc4" 这样的字符 我假设它们来自我的语言中的特殊字符,因为这本书是用我的语言写的。
您正在进行不必要的 encoding/decoding 往返。
查看这个小型互动会话:
>>> s = 'electronică'
>>> b = s.encode('utf-8')
>>> b
b'electronic\xc4\x83'
>>> str(b)
"b'electronic\xc4\x83'"
- 首先,你有一个字符串
s
,你对其进行编码 - 你会得到一个bytes
对象(注意b'...'
符号)。 - 然后您对其调用
str()
,它再次将其转换回字符串——但不是通过解码,而是通过使用额外的引号和转义序列。 - 当您调用
f.writelines()
时,该字符串在内部再次解码以将其写入磁盘。但是因为它都是 ASCII,所以最后一步并不明显。
您应该确保从一开始就使用正确的编码打开文件。
那么你就不必再使用 line.encode('utf-8')
。
因此:
f = open("demofile.txt", "w", encoding="utf-8")
然后:
f.writelines(lines)
请注意,如果您使用 writelines
,则无需执行 for line in lines
;它已经意味着与可迭代的行一起使用。
打开生成的文件时,请确保使用支持 UTF-8 的编辑器。 值得注意的是 "simple" Windows 记事本等工具通常无法正确显示 UTF-8 文件。