如何处理将带有变音符号的外国电影片名导入数据库的编码?

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