Я пытаюсь прочитать файл, созданный в Windows 7 в кодировке UTF-16LE, и сопоставить его содержимое с регулярными выражениями в Ruby 1.9. Я продолжал получать ошибки, когда я не менял кодировку, поэтому я преобразовал его в UTF-8, используя:
lines = File.new(file, "r:UTF-16LE:UTF-8").readlines
Это избавляет от ошибок, но я не всегда могу сопоставить конец строки со специальным символом регулярного выражения "$". Например, строка:
Type: Sticky Note
будет соответствовать / $ /, но не будет соответствовать / e $ /. Я предполагаю, что это как-то связано с символами новой строки Windows UTF-16LE, равными 0x0d00 0x0a00 (\ r \ n с 16 битами каждая; я уверен, что именно так представлены строки, я вижу это в VIM), в то время как UTF-8 на моем Mac просто 0x0a. У меня нет проблем с сопоставлением регулярных выражений, которые не содержат '$'. '^' (начало строки) не проблема. Я думаю, что происходит то, что возврат каретки 0x0d00 торчит вокруг. У кого-нибудь есть идеи, что делать? Спасибо.
@ mu слишком короткий: нет ничего (по крайней мере, на что я могу переместить курсор в Vim) между "e" и концом строки. Линия, которую я привел выше, была только одним примером. Если я возьму любую строку в этом файле и попытаюсь найти совпадение с / LASTCHAROFLINE $ /, я ничего не получу.
@ QTax: Хорошее предложение, но / m не исправляет его
@ Jonas Elfstrom: Я тоже пробовал это, и вы правы - нет проблем, если вы создадите файл UTF-16LE в OS X или предположительно Linux. Кажется, проблема связана с возвратами каретки (\ r), которые используются окнами при переходе на новую строку.
ОБНОВЛЕНИЕ: я решил проблему с
line.gsub!("\r","")
перед попыткой совпадения. Это очищает эти неприятные возвращения кареты. Однако я все еще ищу более изящный способ сделать это, такой как опция или команда при создании моего нового файла.