两个unicode编码代表1个西里尔字母

nem*_*rof 0 python java unicode encoding character-encoding

我有这样的 unicode 和 utf-8 表示形式的字符串:

\n
\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\n
Run Code Online (Sandbox Code Playgroud)\n

\n
\xc3\x90\xe2\x80\xa2\xc3\x91\xc3\x90\xc2\xbb\xc3\x90\xc2\xb8 \xc3\x90\xc2\xbf\xc3\x90\xc2\xbe\xc3\x90\xc2\xb2\xc3\x90\xc2\xb5\xc3\x90\xc2\xb7\xc3\x90\xc2\xb5\xc3\x91\xe2\x80\x9a \xc3\x91\xe2\x80\x9a\xc3\x90\xc2\xbe \xc3\x91\xc3\x90\xc2\xb5\xc3\x90\xc2\xb3\xc3\x90\xc2\xbe\xc3\x90\xc2\xb4\xc3\x90\xc2\xbd\xc3\x91 \xc3\x91\xc6\x92\xc3\x90\xc2\xb6\xc3\x90\xc2\xb5 \xc3\x91\xc3\x90\xc2\xba\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x91\xc6\x92.\n
Run Code Online (Sandbox Code Playgroud)\n

所需的输出为 "\xd0\x95\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbf\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xb7\xd0\xb5\xd1\x82 \ xd1\x82\xd0\xbe\xd1\x81\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8f\xd1\x83\xd0\xb6\xd0\xb5\xd1\ x81\xd0\xba\xd0\xb8\xd0\xbd\xd1\x83”。

\n

我已经尝试了所有可能的编码,但仍然无法获得完整的西里尔字母形式。

\n

我得到的最好的是

\n
'\xef\xbf\xbd?\xef\xbf\xbd?\xd0\xbb\xd0\xb8 \xd0\xbf\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xb7\xd0\xb5\xef\xbf\xbd? \xef\xbf\xbd?\xd0\xbe \xef\xbf\xbd?\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb4\xd0\xbd\xef\xbf\xbd? \xef\xbf\xbd?\xd0\xb6\xd0\xb5 \xef\xbf\xbd?\xd0\xba\xd0\xb8\xd0\xbd\xef\xbf\xbd?'\n
Run Code Online (Sandbox Code Playgroud)\n

使用 Windows-1252。

\n

而且我还注意到所需字符串中的一个西里尔字母意味着两种 unicode 编码。

\n

例如:\\u00d0\\u0095 = '\xd0\x95'.\n也许有人知道什么编码以及如何使用它来获得正常结果?

\n

Mar*_*nen 5

您有一个错误解码的字符串,其中 UTF-8 字节被转换为 ISO-8859-1(也称为latin1)。理想情况下,使用正确的编码重新下载,但您也可以使用错误使用的编码进行编码以重新获得原始字节流,然后使用正确的编码(UTF-8)进行解码:

\n

Python:

\n
>>> s = \'\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\'\n>>> s\n\'\xc3\x90\\x95\xc3\x91\\x81\xc3\x90\xc2\xbb\xc3\x90\xc2\xb8\xc3\x90\xc2\xbf\xc3\x90\xc2\xbe\xc3\x90\xc2\xb2\xc3\x90\xc2\xb5\xc3\x90\xc2\xb7\xc3\x90\xc2\xb5\xc3\x91\\x82 \xc3\x91\\x82\xc3\x90\xc2\xbe\xc3\x91\\x81\xc3\x90\xc2\xb5\xc3\x90\xc2\xb3\xc3\x90\xc2\xbe\xc3\x90\xc2\xb4\xc3\x90\xc2\xbd\xc3\x91\\x8f\xc3\x91\\x83\xc3\x90\xc2\xb6\xc3\x90\xc2\xb5\xc3\x91\\x81\xc3\x90\xc2\xba\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x91\\x83\'\n>>> print(s)\n\xc3\x90\xc3\x91\xc3\x90\xc2\xbb\xc3\x90\xc2\xb8\xc3\x90\xc2\xbf\xc3\x90\xc2\xbe\xc3\x90\xc2\xb2\xc3\x90\xc2\xb5\xc3\x90\xc2\xb7\xc3\x90\xc2\xb5\xc3\x91 \xc3\x91\xc3\x90\xc2\xbe\xc3\x91\xc3\x90\xc2\xb5\xc3\x90\xc2\xb3\xc3\x90\xc2\xbe\xc3\x90\xc2\xb4\xc3\x90\xc2\xbd\xc3\x91\xc3\x91\xc3\x90\xc2\xb6\xc3\x90\xc2\xb5\xc3\x91\xc3\x90\xc2\xba\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x91\n>>> s.encode(\'latin1\')\nb\'\\xd0\\x95\\xd1\\x81\\xd0\\xbb\\xd0\\xb8\\xd0\\xbf\\xd0\\xbe\\xd0\\xb2\\xd0\\xb5\\xd0\\xb7\\xd0\\xb5\\xd1\\x82 \\xd1\\x82\\xd0\\xbe\\xd1\\x81\\xd0\\xb5\\xd0\\xb3\\xd0\\xbe\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f\\xd1\\x83\\xd0\\xb6\\xd0\\xb5\\xd1\\x81\\xd0\\xba\\xd0\\xb8\\xd0\\xbd\\xd1\\x83\'\n>>> s.encode(\'latin1\').decode(\'utf8\')\n\'\xd0\x95\xd1\x81\xd0\xbb\xd0\xb8\xd0\xbf\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xb7\xd0\xb5\xd1\x82 \xd1\x82\xd0\xbe\xd1\x81\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8f\xd1\x83\xd0\xb6\xd0\xb5\xd1\x81\xd0\xba\xd0\xb8\xd0\xbd\xd1\x83\'\n
Run Code Online (Sandbox Code Playgroud)\n

您还可能有一个 Unicode 转义码的文字字符串,这有点棘手:

\n
>>> s=r\'\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\'\n>>> print(s)\n\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,必须将字符串转换回字节,解码为 Unicode 转义符,然后编码回字节并正确解码为 UTF-8。 latin1具有以下功能:Unicode 的前 256 个代码点映射到该编解码器中的字节 0-255,因此它将 1:1 代码点转换为字节值。

\n
>>> s=r\'\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\'\n>>> print(s)\n\\u00d0\\u0095\\u00d1\\u0081\\u00d0\\u00bb\\u00d0\\u00b8\\u00d0\\u00bf\\u00d0\\u00be\\u00d0\\u00b2\\u00d0\\u00b5\\u00d0\\u00b7\\u00d0\\u00b5\\u00d1\\u0082 \\u00d1\\u0082\\u00d0\\u00be\\u00d1\\u0081\\u00d0\\u00b5\\u00d0\\u00b3\\u00d0\\u00be\\u00d0\\u00b4\\u00d0\\u00bd\\u00d1\\u008f\\u00d1\\u0083\\u00d0\\u00b6\\u00d0\\u00b5\\u00d1\\u0081\\u00d0\\u00ba\\u00d0\\u00b8\\u00d0\\u00bd\\u00d1\\u0083\n
Run Code Online (Sandbox Code Playgroud)\n