在C#中使用UTF-8字符集的IMAP搜索命令

时间:2012-04-12 20:16:35

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

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"

1 个答案:

答案 0 :(得分:3)

对于搜索字词,您使用的是所谓的文字。必须以八位字节指定文字的长度。在你的例子中并非如此。以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进行测试。