Ruby: конвертировать закодированный символ в реальный символ UTF-8 - PullRequest
3 голосов
/ 17 ноября 2009

Ruby не будет хорошо играть со строками UTF-8. Я передаю данные в файл XML, и хотя документ XML указан как UTF-8, он обрабатывает кодировку ascii (два байта на символ) как отдельные символы.

Я начал кодировать входные строки в формате '\ uXXXX', однако я не могу понять, как преобразовать это в фактический символ UTF-8. Я искал все на этом сайте и Google безрезультатно, и мое разочарование сейчас довольно высоко. Я использую Ruby 1.8.6

По сути, я хочу преобразовать строку '\ u03a3' -> "Σ".

Что у меня было:

data.gsub /\\u([a-zA-Z0-9]{4})/,  $1.hex.to_i.chr

Что, конечно, выдает ошибку «931 вне диапазона символов».

Спасибо Тим

Ответы [ 3 ]

5 голосов
/ 25 июля 2012

Попробуйте это:

[0x50].pack("U")

где 0x50 - шестнадцатеричный код символа utf8.

2 голосов
/ 17 ноября 2009

Что-то ломается, потому что строки Ruby обрабатывают кодированные точки UTF-8 как два символа? Если нет, то вы не должны слишком беспокоиться об этом. Если что-то сломается, пожалуйста, добавьте комментарий, чтобы сообщить нам. Вероятно, лучше решить эту проблему, а не искать обходной путь.

Если вам нужно выполнить преобразования, посмотрите библиотеку Iconv.

В любом случае, Σ может быть лучшей альтернативой \u03a3. \ uXXXX используется в JSON, но не в XML. Если вы хотите проанализировать формат \ uXXXX, посмотрите на некоторые библиотеки JSON, как они это делают.

1 голос
/ 17 ноября 2009

Ruby (по крайней мере, 1.8.6) не имеет полной поддержки Unicode. Integer#chr поддерживает только символы ASCII и в противном случае только до 255 в восьмеричной записи ('\377').

Для демонстрации:

irb(main):001:0> 255.chr
=> "\377"
irb(main):002:0> 256.chr
RangeError: 256 out of char range
        from (irb):2:in `chr'
        from (irb):2

Вы можете попробовать перейти на Ruby 1.9. В документах chr явно не указывается ASCII, поэтому поддержка может быть расширена - хотя примеры останавливаются на 255.

Или вы можете попробовать ruby-unicode . Я никогда не пробовал сам, поэтому не знаю, насколько хорошо это поможет.

В противном случае, я не думаю, что в настоящее время вы можете делать то, что хотите, в Ruby.

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