2012-08-30 5 views
0

У меня есть блок кода:Кодировка URL в рубин

temp = "Cancel" 
puts CGI::escape(words[1]) 
puts "\n" 
puts CGI::escape(temp) 
puts "\n" 
puts words[1] 
puts "\n" 
puts temp 
puts "\n" 

Мой результат:

%00C%00a%00n%00c%00e%00l%00 

Cancel 

Cancel 

Cancel 

Я думаю, что это справедливо предположить, что речь здесь идет так, как я настроить мои слова массив. Однако мне было интересно, является ли это обычным поведением, которое имеет решение? Если нет, что я могу делать неправильно, что бы это вызвало?

Мой массив слов настроен путем чтения данных из файла, затем разбивает каждую строку и извлекает необходимую мне информацию, поэтому он не слишком сложный.

+2

Может ли ваша строка быть в 16-битной кодировке? –

+0

@muistooshort, согласился. У этого есть запах UTF-16. –

ответ

3

У вас в строке имеется NUL байт. puts просто игнорирует их.

1.9.2p290 :016 > puts "Fo\0oooo" 
Fooooo 
=> nil 

с инспектировать вы можете увидеть их:

1.9.2p290 :017 > puts "Fo\0oooo".inspect 
"Fo\u0000oooo" 
=> nil 

и здесь выход CGI::escape

1.9.2p290 :018 > puts CGI::escape("Fooo\0ooo") 
Fooo%00ooo 
=> nil 

редактировать:

Быстрое и грязное решение было бы просто удалить их:

"Fooooo\0ooo".gsub(/\0/, "") 
=> "Foooooooo" 

но поскольку у вас есть NUL байт перед каждым символом, вам лучше проверить свой код для чтения файла. Если бы вы предоставили код, было бы легче придумать решение.

+0

Лучшим решением было бы определить, является ли файл UTF-16, а затем, если это так, откройте его как таковое до его чтения. –

+0

Я написал: 'но поскольку у вас есть NUL байт перед каждым символом, вам лучше проверить свой код для чтения файла.', Который включает проверку кодировки, не так ли? – drexin

+0

Я попытался открыть файл как UTF-16BE и UTF-16LE, но оба формата вызывают следующую ошибку: 'ASCII несовместимая кодировка требует binmode (ArgumentError)'. Очевидно, что открытие двоичного кода не помогло, поэтому любые идеи? – Olshansk