【发布时间】:2016-07-09 19:24:51
【问题描述】:
这里我从外部 db ãƒ\u008F 得到一个字符串,我想将它转换回 unicode 字符。我知道db使用的是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')
# => "ハ"
【问题讨论】:
-
你指向一个 ?类型字符,通常表示无效。有no such character in Windows-1252,因此将其编码为错误。为什么不使用
force_encoding? -
如果字符串已经具有 UTF-8 表示的正确字节,那么解决方案是(如@tadman 所说),执行
str.force_encoding('utf-8')。这就是所有必要的。如果实际字节已经正确,则不应使用encode。 -
@Jordan,问题是,字符串的表示是
ãƒ\u008F,"ãƒ\u008F".force_encoding('utf-8')仍然是ãƒ\u008F -
您从数据库中获取的字符串的实际字节值是多少(十进制或十六进制)?
-
问题是,字符串的表示是 ãƒ\u008F -- 你说的好像一个字符串只有一个表示。我说字符串的表示是
ハ。谁是对的?您的数据库正在使用带有 Windows-1252 镜头的相机来拍摄原始字节的照片。我正在使用带有 UTF-8 镜头的相机来拍摄原始字节的照片。我们的想法是为您的相机选择合适的镜头。 force_encoding() 将允许您选择正确的镜头
标签: ruby encoding utf-8 windows-1252