Ruby читает веб-страницу с кодировкой `GB2313`, как проверить, содержит ли контент какое-либо ключевое слово? - PullRequest
1 голос
/ 09 июля 2010

Я использую ruby ​​для чтения веб-страницы, и ее содержание:

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=GB2312" />
</HEAD>
<BODY>
中文
</BODY>
</HTML>

Из мета видно, что он использует кодировку GB2312.

Мой код:

res = Net::HTTP.post_form(URI.parse("http://xxx/check"), 
                              {:query=>'xxx'})

Тогда я использую:

res.include?("中文")

чтобы проверить, есть ли в содержании это слово. Но если показывает false.

Я не знаю, почему это ложно, и что мне делать? Какую кодировку ruby ​​1.8.7 использовать? Если мне нужно конвертировать кодировку, как это сделать?

1 Ответ

1 голос
/ 09 июля 2010

Ruby 1.8 не использует кодировки, он использует простые байтовые строки. Если вы хотите, чтобы строка байтов в вашей программе соответствовала строке байтов на веб-странице, вам нужно сохранить файл .rb в той же кодировке, что и веб-страницы (GB2312), чтобы Ruby видел те же байты. 1001 *

Вероятно, лучше было бы написать строку байтов явно, избегая проблем, связанных с кодировкой файла .rb:

res.include?("\xD6\xD0\xCE\xC4")

Однако совпадающие строки байтов не соответствуют символам надежно, когда используются многобайтовые кодировки (за исключением UTF-8, который специально предназначен для этого). Если на веб-странице была строка:

兄形男

в нем, это будет закодировано как "\xD0\xD6\xD0\xCE\xC4\xD0". Который содержит последовательность байтов "\xD6\xD0\xCE\xC4", поэтому include? будет true, даже если символы 中文 отсутствуют.

Если вам нужно полностью надежно обрабатывать символы, не входящие в ASCII, вам нужен язык с поддержкой Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...