【问题标题】:IMAP SEARCH CHARSET with ISO-8859-1使用 ISO-8859-1 的 IMAP 搜索字符集
【发布时间】:2012-09-23 09:39:24
【问题描述】:

我不明白使用 Tunderbird 命令在 IMAP 服务器上搜索时使用什么编码方法 IMAP SEARCH CHARSET

我尝试搜索俄语单词“привет”,它被映射到“?@825B”,即

A001 SEARCH CHARSET ISO-8859-1 BODY "?@825B"

这是怎么发生的?我确信这是正确的,因为我使用嗅探器来捕获它,并且 Dovecot 服务器正确地找到了带有“привет”字样的邮件。 ISO-8859-1 编码根本没有俄语字形!那么它是如何转换的呢?

例如,"привет"(写成 Unicode 字符)为 ISO-8859-1 给出 "??????" > 在我的机器上或这里编码http://www.motobit.com/util/charset-codepage-conversion.asp

【问题讨论】:

  • 您拥有的字符串看起来一点也不像 UTF-8。事实上,它看起来像是一些传统的 8 位西里尔编码(KOI-8?CP1251?)被剥夺了第八位。我们只能推测这发生在哪里。一个好的开始是实际字节的十六进制转储。
  • 为什么你认为“привет”这个词的符号在 UTF-8 中不存在?请参阅 UTF-8 的 HEX 转储:d0 bf d1 80 d0 b8 d0 b2 d0 b5 d1 82
  • 是的,应该是这样,但是没有明显的从它到 "?@825B" 的映射,通常你也会得到与字节一样多的问号。所以我猜测传入的不是真正的 UTF-8。
  • 如果不是 UTF-8,这是什么?我的默认系统字符集为 UTF-8,当我在键盘上输入单词“привет”到 Thunderbird 的搜索对话窗口时,我希望“привет”是用 UTF-8 编码编写的。不要?
  • 另一端出来的东西是错的;没有办法从这些信息中推断出它到底哪里出了问题。这很可能是 Thunderbird 中的一个错误。

标签: character-encoding imap iso-8859-1 thunderbird


【解决方案1】:

Thunderbird 获取此值的方式是将一个(16 位?)Unicode 字符向下转换为一个字节。

例如,在 C# 中(其 char 和 string 类型在内部使用 UTF-16),这将得到您所看到的结果:

const string text = "привет";

var buffer = new char[text.Length];
for (int i = 0; i < text.Length; i++)
    buffer[i] = (char) ((byte) text[i]);

var result = new string (buffer);

Thunderbird 如何处理代理对是任何人根据问题已知的猜测。它可能会将代理对视为 2 个单独的字符(就像我上面的代码一样),或者它可能会将它们组合成一个 32 位 unicode 字符并将其向下转换为一个字节。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2013-01-19
    • 2012-09-29
    • 2016-11-26
    • 2012-09-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多