在保留未定义字符的同时进行编码

时间:2016-03-22 18:25:29

标签: ruby encoding utf-8 windows-1252

这里我从db ãƒ\u008F外部得到一个字符串,我想将其转换回unicode字符。我知道数据库正在使用windows-1252编码,因此实际字符应为\xe3\x83\x8f,在utf-8编码中为

以下是我迄今为止尝试过的事情

"ãƒ\u008F".encode('windows-1252')
# => Encoding::UndefinedConversionError: U+008F to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252

"ãƒ\u008F".encode('windows-1252', undef: :replace)
# => "\xE3\x83?"

这是合理的,因为在0x8f的代码页中windows-1252未定义。

----------Windows-1252-----------
  0 1 2 3 4 5 6 7 8 9 a b c d e f
2   ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~ 
8 € � ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ � Ž � <---right here!
9 � ‘ ’ “ ” • – — ˜ ™ š › œ � ž Ÿ
a   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
b ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
c À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
d Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
e à á â ã ä å æ ç è é ê ë ì í î ï
f ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

我的问题是,如何在保留未定义字符的同时进行编码?即,我怎样才能获得

s = "ãƒ\u008F".some_magic_methods
# => "\xE3\x83\x8F"

s.force_encoding('utf-8')
# => "ハ"

1 个答案:

答案 0 :(得分:1)

我想我对这里发生的事情有一个模糊的概念,但我在制定正确的解释方面遇到了麻烦。不过,这里的解决方案至少适用于您的一个例子:

str = "ãƒ\u008F"
str2 = str.chars.map {|c| c.encode('windows-1252').ord rescue c.ord }
         .pack('C*').force_encoding('utf-8')
puts str2
# => ハ

当然,对于大型文本来说这是非常低效的,但希望它会有所帮助。如果我稍后有资金,我会回来并尝试添加更好的解释。