Я читаю строку YAML из базы данных, которую я не могу контролировать, в которой юникод хранится в виде строковых литералов.

Я хотел бы вывести фактический символ ö в файл csv, но он все еще выводит \\xC3\\xB6

Помогите.

-2
Donatello Tallfeather 5 Ноя 2018 в 11:36

1 ответ

Лучший ответ

База данных явно содержит искаженные строки. Поскольку вы не можете исправить ошибку в ее источнике (т.е. в базе данных), вы можете использовать gsub для замены каждой шестнадцатеричной escape-последовательности ее фактическим значением:

str = "\\xc3\\xb6"
#=> "\\xc3\\xb6"
str.length
#=> 8

str.gsub!(/\\x(\h{2})/) { [$1].pack('H2') }
#=> "\xC3\xB6"
str.length
#=> 2

Затем вы можете указать Ruby интерпретировать байты строки как UTF-8:

str.force_encoding('UTF-8')
#=> "ö"
str.length
#=> 1
0
Stefan 5 Ноя 2018 в 09:23