如何处理将带有变音符号的外国电影片名导入数据库的编码?
How do I handle encoding for importing foreign movie titles with diacritics into a database?
这可能没有一个规则,但我正在尝试找到一种方法来处理 PSQL 导入与在 bash 或其他程序中检索和显示记录之间的编码。我对编码的想法真的很陌生,所以请多多包涵!我 运行 正在处理字符“é”的问题。我在导入时遇到错误 ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x72 0x61
(我相信它的默认设置是 UTF-8),并且能够通过在导入时将编码更改为 Windows-1251 来临时修复它。但是,尝试检索 bash 中的数据时出现错误 ERROR: character with byte sequence 0xd0 0xb9 in encoding "UTF8" has no equivalent in encoding "WIN1252"
,因此我假设 bash 使用的是 1252 编码。
我全部删除了,用WIN1252编码重新导入,导入和检索都有效。我担心的是我是否可能 运行 遇到显示此字符或尝试在浏览器上检索它的问题。目前,如果我 select 电影 bash 中的 id,我会得到 Les MisΘrables
。老实说,不理想,但如果不会出现错误,我觉得没问题。不过,当由于编码不匹配而无法完成查询时,这确实让我感到害怕。
以我对UTF-8的一点了解,我觉得'é'这个字符应该首先被接受。我在网上搜索了一个字符集,就在上面。谁能告诉我更多关于这一切的信息?我倾向于使用 UTF-8,因为它似乎最普遍,但我不知道为什么它给我带来了麻烦。谢谢!
编辑:我完全缺乏关于编码的知识导致我永远不会保存专门编码为 UTF-8 的文件。那解决了它。感谢所有调查此问题的人!
在问题中描述了三个不同的个体问题。 Python 中给出的代码示例(我希望通常是可以理解的)。
1st ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x72 0x61
的意思就是:它不是 UTF-8:
>>> print(bytearray([0xe9,0x72,0x61]).decode('latin1'))
éra
第二ERROR: character with byte sequence 0xd0 0xb9 in encoding "UTF8" has no equivalent in encoding "WIN1252"
。来源是 UTF-8,结果是西里尔字母 ('WIN1251'
):
>>> print(bytearray([0xd0,0xb9]).decode('UTF-8'))
й
第三 我得到Les MisΘrables
(可能而不是Les Misérables
?)这是公然的mojibake 案例:
>>> print('Les Misérables'.encode('latin1').decode('cp437'))
Les MisΘrables
很好,这里是对讨论的字节值和相应字符的概括。请注意,“CodePoint
”列包含 Unicode (U+hhhh
) 和 UTF-8 字节:
Char CodePoint Category Description
---- --------- -------- -----------
é {U+00E9, 0xC3,0xA9} LowercaseLetter Latin Small Letter E With Acute
r {U+0072, 0x72} LowercaseLetter Latin Small Letter R
a {U+0061, 0x61} LowercaseLetter Latin Small Letter A
Ð {U+00D0, 0xC3,0x90} UppercaseLetter Latin Capital Letter Eth
¹ {U+00B9, 0xC2,0xB9} OtherNumber Superscript One
й {U+0439, 0xD0,0xB9} LowercaseLetter Cyrillic Small Letter Short I
Θ {U+0398, 0xCE,0x98} UppercaseLetter Greek Capital Letter Theta
这可能没有一个规则,但我正在尝试找到一种方法来处理 PSQL 导入与在 bash 或其他程序中检索和显示记录之间的编码。我对编码的想法真的很陌生,所以请多多包涵!我 运行 正在处理字符“é”的问题。我在导入时遇到错误 ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x72 0x61
(我相信它的默认设置是 UTF-8),并且能够通过在导入时将编码更改为 Windows-1251 来临时修复它。但是,尝试检索 bash 中的数据时出现错误 ERROR: character with byte sequence 0xd0 0xb9 in encoding "UTF8" has no equivalent in encoding "WIN1252"
,因此我假设 bash 使用的是 1252 编码。
我全部删除了,用WIN1252编码重新导入,导入和检索都有效。我担心的是我是否可能 运行 遇到显示此字符或尝试在浏览器上检索它的问题。目前,如果我 select 电影 bash 中的 id,我会得到 Les MisΘrables
。老实说,不理想,但如果不会出现错误,我觉得没问题。不过,当由于编码不匹配而无法完成查询时,这确实让我感到害怕。
以我对UTF-8的一点了解,我觉得'é'这个字符应该首先被接受。我在网上搜索了一个字符集,就在上面。谁能告诉我更多关于这一切的信息?我倾向于使用 UTF-8,因为它似乎最普遍,但我不知道为什么它给我带来了麻烦。谢谢!
编辑:我完全缺乏关于编码的知识导致我永远不会保存专门编码为 UTF-8 的文件。那解决了它。感谢所有调查此问题的人!
在问题中描述了三个不同的个体问题。 Python 中给出的代码示例(我希望通常是可以理解的)。
1st ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x72 0x61
的意思就是:它不是 UTF-8:
>>> print(bytearray([0xe9,0x72,0x61]).decode('latin1'))
éra
第二ERROR: character with byte sequence 0xd0 0xb9 in encoding "UTF8" has no equivalent in encoding "WIN1252"
。来源是 UTF-8,结果是西里尔字母 ('WIN1251'
):
>>> print(bytearray([0xd0,0xb9]).decode('UTF-8'))
й
第三 我得到Les MisΘrables
(可能而不是Les Misérables
?)这是公然的mojibake 案例:
>>> print('Les Misérables'.encode('latin1').decode('cp437'))
Les MisΘrables
很好,这里是对讨论的字节值和相应字符的概括。请注意,“CodePoint
”列包含 Unicode (U+hhhh
) 和 UTF-8 字节:
Char CodePoint Category Description
---- --------- -------- -----------
é {U+00E9, 0xC3,0xA9} LowercaseLetter Latin Small Letter E With Acute
r {U+0072, 0x72} LowercaseLetter Latin Small Letter R
a {U+0061, 0x61} LowercaseLetter Latin Small Letter A
Ð {U+00D0, 0xC3,0x90} UppercaseLetter Latin Capital Letter Eth
¹ {U+00B9, 0xC2,0xB9} OtherNumber Superscript One
й {U+0439, 0xD0,0xB9} LowercaseLetter Cyrillic Small Letter Short I
Θ {U+0398, 0xCE,0x98} UppercaseLetter Greek Capital Letter Theta