2012-02-03 2 views
2

У меня есть простой постоянный хэш со строковыми ключами определено:хэш строки получить неправильно закодирован

MY_CONSTANT_HASH = { 
'key1' => 'value1' 
} 

Теперь, я заметил, что encoding.name на ключ является US-ASCII. Однако Encoding.default_internal установлен на UTF-8 заранее. Почему это неправильно кодируется? Я не могу force_encoding позже, так как объект заморожен в этой точке, так что я получаю эту ошибку:

can't modify frozen String

PS: Я использую рубин 1.9.3p0 (2011-10-30 ревизия 33570) ,

ответ

2

по умолчанию internal и external кодировок направлены на IO операций:

  • CSV данные
  • чтения файла с диска
  • имена файлов из Dir
  • и т.д ...

Проще всего сделать это, чтобы добавить комментарий # encoding=utf-8, чтобы сообщить Ruby, что так Файл urce кодируется в кодировке UTF-8. Например, если вы запустите этот:

# encoding=utf-8 
H = { 'this' => 'that' } 
puts H.keys.first.encoding 

как АВТОНОМНЫЙ Руби скрипт вы получите UTF-8, но если вы запустите это:

H = { 'this' => 'that' } 
puts H.keys.first.encoding 

вы, вероятно, получите US- ASCII.

+0

Является ли это официальным способом установки кодировки для встроенных строк? Кроме того, по ссылке вы можете прочитать следующее: «В качестве кодирования созданных строк используется кодировка локали (__ ENCODING __), а не default_internal». – m33lky

+0

@ m33lky: Я думаю, что взлом «волшебного комментария» является таким же официальным, как и он, есть и другие варианты. Единственная проблема в зависимости от настроек языкового стандарта заключается в том, что они являются внешними по отношению к приложению или исходному файлу, поэтому вы можете получить странные нелокальные эффекты, если вы измените свой язык, работаете с другого компьютера, забудьте установить локаль на сервере , ... –

 Смежные вопросы

  • Нет связанных вопросов^_^