【问题标题】:IMAP search command with UTF-8 charset in C#C# 中带有 UTF-8 字符集的 IMAP 搜索命令
【发布时间】:2012-04-12 20:16:35
【问题描述】:

C# Imap search command with special characters like á,é

我正在尝试在 C# 中实现上述帖子中提到的逻辑,以在 gmail 中实现基于非 ascii 的搜索。成功登录 imap.gmail.com 后,我与服务器进行了以下交易:

(C -> S) Encoding.Default.GetBytes("A4 UID SEARCH CHARSET UTF-8 TEXT {4}\r\n");
(C <- S) "+ go ahead\r\n"
(C -> S) Encoding.Default.GetBytes("αβγδ\r\n");
(C <- S) "* SEARCH 72\r\nA2 OK SEARCH completed (Success)"

但是,服务器响应表示的电子邮件与我提供的搜索词完全无关。这只发生在关键字中使用非 ascii 字符时,我相信我的编码有问题。

我也尝试过使用Encoding.Ascii,但我得到的搜索结果更加偏离目标。

发送字符串文字的正确方法是什么:"αβγδ\r\n"

【问题讨论】:

    标签: search encoding utf-8 imap 8-bit


    【解决方案1】:

    对于搜索词,您使用的是所谓的literal。文字的长度必须以八位字节指定。在您的示例中并非如此。 UTF-8 编码的字符串“αβγδ”由四个以上的八位字节组成。

    因此,您应该在将长度发送到服务器之前对搜索词进行编码。

    我对 C# 了解不多。我用 Python 做一个例子:

    search_term = 'Grüße'
    encoded_search_term = search_term.encode('UTF-8')
    length = str(len(encoded_search_term)).encode('ascii')
    
    send(b'. UID SEARCH CHARSET UTF-8 TEXT {' + length + b'}\r\n')
    read_until(br'^\+ .*$')
    
    send(encoded_search_term + b'\r\n')
    read_until(br'^\. OK .*$')
    

    使用此代码,搜索命令会返回带有文本“Grüße”的电子邮件的 UID:

    C: b'. UID SEARCH CHARSET UTF-8 TEXT {7}\r\n'
    S: b'+ Ready for literal data\r\n'
    C: b'Gr\xc3\xbc\xc3\x9fe\r\n'
    S: b'* SEARCH 1 3 4\r\n'
    S: b'. OK UID SEARCH completed\r\n'
    

    如果我使用字符长度 (len(search_term)) 而不是八位字节的编码长度 (len(encoded_search_term)),IMAP 服务器会报告错误:

    C: b'. UID SEARCH CHARSET UTF-8 TEXT {5}\r\n'
    S: b'+ Ready for literal data\r\n'
    C: b'Gr\xc3\xbc\xc3\x9fe\r\n'
    S: b'. BAD expected end of data instead of "\\237e"\r\n'
    

    请注意,我没有使用 Gmail 进行测试。

    【讨论】:

    • 我的立场是正确的。我会尽快测试这个。如果我理解正确,我做错的两件事是#1我没有执行将搜索词转换为UTF8中的字节(而不是Encoding.Default)和#2我应该将解码的字节数放在{ 4} 现在。再次提前感谢,如果我误解了您的答案,请随时纠正我。
    • search_term = 'Grüße' encoded_search_term = search_term.encode('UTF-8') length = str(len(encoded_search_term)).encode('ascii') 这部分很有启发性。我自己永远也想不通。感谢十亿 m8。我希望我有足够的积分来支持你。正如我所说,我会尽快测试这个。干杯。
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2016-06-09
    相关资源
    最近更新 更多