在保留未定义字符的同时进行编码
Encode while preserving undefined characters
这里我从数据库外部得到了一个字符串ãƒ\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')
# => "ハ"
我想我对这里发生的事情有一个模糊的想法,但我无法形成一个正确的解释。尽管如此,这里有一个至少适用于您的示例的解决方案:
str = "ãƒ\u008F"
str2 = str.chars.map {|c| c.encode('windows-1252').ord rescue c.ord }
.pack('C*').force_encoding('utf-8')
puts str2
# => ハ
当然,这对于大文本来说效率很低,但希望它能有所帮助。如果我稍后有足够的资金,我会回来并尝试添加更好的解释。
这里我从数据库外部得到了一个字符串ãƒ\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')
# => "ハ"
我想我对这里发生的事情有一个模糊的想法,但我无法形成一个正确的解释。尽管如此,这里有一个至少适用于您的示例的解决方案:
str = "ãƒ\u008F"
str2 = str.chars.map {|c| c.encode('windows-1252').ord rescue c.ord }
.pack('C*').force_encoding('utf-8')
puts str2
# => ハ
当然,这对于大文本来说效率很低,但希望它能有所帮助。如果我稍后有足够的资金,我会回来并尝试添加更好的解释。