Как я могу сделать ruby to_yaml метод для хранения строк utf8 с оригинальными знаками, но не escape-последовательность?Ruby to_yaml utf8 string
3
A
ответ
3
Это, вероятно, очень плохая идея, поскольку я уверен, что YAML имеет свои причины для кодирования символов, как это делает, но это, кажется, не слишком сложно, чтобы отменить:
require 'yaml'
require 'yaml/encoding'
text = "Ça va bien?"
puts text.to_yaml(:Encoding => :Utf8) # => --- "\xC3\x87a va bien?"
puts YAML.unescape(YAML.dump(text)) # => --- "Ça va bien?"
3
7
require 'yaml'
YAML::ENGINE.yamler='psych'
'Résumé'.to_yaml # => "--- Résumé\n...\n"
Рубиновые суда с двумя двигателями YAML: сик и психологи. Syck старен и не поддерживается, но по умолчанию он равен 1.9.2, поэтому нужно переключиться на психику. Психические сбрасывают строки UTF-8 в UTF-8.
2
Для Ruby 1.9.3+ это не проблема: по умолчанию YAML-движок - это Psych, который поддерживает UTF-8 по умолчанию.
Для Руби 1.9.2- вам нужно установить psych
камень и требуют , прежде чем требовать YAML:
irb(main):001:0> require 'yaml'
#=> true
irb(main):002:0> require 'psych'
#=> true
irb(main):003:0> YAML::ENGINE
#=> #<YAML::EngineManager:0x00000001a1f642 @yamler="syck">
irb(main):004:0> "ça va?".to_yaml
#=> "--- \"\\xC3\\xA7a va?\"\n"
irb(main):001:0> require 'psych' # gem install psych
#=> true
irb(main):002:0> require 'yaml'
#=> true
irb(main):003:0> YAML::ENGINE
#=> #<YAML::EngineManager:0x00000001a1f828 @yamler="psych">
irb(main):004:0> "ça va bien!".to_yaml
#=> "--- ça va bien!\n...\n"
В качестве альтернативы, установите yamler
, как Евгений предлагает (если вы установили драгоценный камень psych
):
irb(main):001:0> require 'yaml'
#=> true
irb(main):002:0> YAML::ENGINE.yamler
#=> "syck"
irb(main):003:0> "ça va?".to_yaml
#=> "--- \"\\xC3\\xA7a va?\"\n"
irb(main):004:0> YAML::ENGINE.yamler = 'psych'
#=> "psych"
irb(main):005:0> "ça va".to_yaml
#=> "--- ça va\n...\n"
Смежные вопросы
- 1. Strange ruby to_yaml поведение
- 2. Рубин массив # to_yaml не вызывает to_yaml рекурсивно
- 3. Глубина ограничена pp или to_yaml в ruby
- 4. `bundler install --deployment` отсутствует` to_yaml`?
- 5. encode string to utf8
- 6. iOS: decode utf8 string
- 7. PHP - urldecode - utf8 string?
- 8. Python UTF8 string confusion
- 9. Документация для Psych to_yaml options?
- 10. Отсутствующий метод «to_yaml» в IronRuby
- 11. Пользовательский to_yaml и domain_type
- 12. Как я могу запретить использование .to_yaml Ruby от ссылок?
- 13. Можно ли указать параметры форматирования to_yaml в ruby?
- 14. Почему я получаю NoMethodError с помощью to_yaml в Ruby
- 15. PHP HTML decode string-utf8
- 16. Как правильно настроить to_yaml
- 17. Проблема с кодировкой Ruby UTF8
- 18. CakePHP and MongoDB: not-utf8 string notice
- 19. Unicode (UTF8) string число слов в PHP
- 20. jsonObject.getString ("String in UTF8"), дающий пробел
- 21. integer to utf8 string не работает C#
- 22. Split utf8 string в массив символов
- 23. UTF8 Byte to String & Winsock GetStream
- 24. java convert String windows-1251 to utf8
- 25. C++ string manipulation with the utf8 locale
- 26. Проверьте, действительно ли String MySQL UTF8?
- 27. std :: string, std :: wstring и UTF8
- 28. Swift 2.1 [UInt8] --utf8 -> String?
- 29. читать файл UTF8 и сравнивать с String
- 30. Как преобразовать строку в UTF8 в Ruby
В прошлом было целесообразно использовать кодировку ASCII по умолчанию, но это не так Теперь. И в руководстве говорится: «Потоки YAML кодируются с использованием набора печатных символов Unicode, либо в UTF-8, либо в UTF-16». Поэтому я думаю, что это просто ограничение в библиотеке Ruby, to_yaml должно возвращать UTF-8 по умолчанию. В противном случае очень важно изменить этот YAML с помощью редактора. – tokland
dump иногда возвращает двоичный тип: YAML.unescape (YAML.dump ("sú")) -> ---! Binary | c8O6 – tokland