将UTF-8 iso-8859字节-字符串转换为字符列表
我遇到了一个奇怪的问题。我有一个从外部源接收字节数据的程序,我反过来执行一些业务逻辑并发送回复。我们遇到了一个关于String.to_charlist的奇怪问题 在iex中试试这个:将UTF-8 iso-8859字节-字符串转换为字符列表,utf-8,elixir,Utf 8,Elixir,我遇到了一个奇怪的问题。我有一个从外部源接收字节数据的程序,我反过来执行一些业务逻辑并发送回复。我们遇到了一个关于String.to_charlist的奇怪问题 在iex中试试这个: String.to_charlist <<169, 99, 111, 114, 94, 51, 94, 51, 94, 66, 52, 57, 49, 49, 49, 32, 32, 49, 48, 51, 53, 94, 67, 79, 77, 80, 76, 69, 84, 69, 68, 94,
String.to_charlist <<169, 99, 111, 114, 94, 51, 94, 51, 94, 66, 52, 57, 49, 49, 49, 32, 32, 49, 48, 51, 53, 94, 67, 79, 77, 80, 76, 69, 84, 69, 68, 94, 49, 49, 52, 50, 52, 53, 94, 75>>
String.to\u字符列表
这将引发以下错误:
** (UnicodeConversionError) invalid encoding starting at <<169, 99, 111, 114, 94, 51, 94, 51, 94, 66, 52, 57, 49, 49, 49, 32, 32, 49, 48, 51, 53, 94, 67, 79, 77, 80, 76, 69, 84, 69, 68, 94, 49, 49, 52, 50, 52, 53, 94, 75>>
(elixir) lib/string.ex:2035: String.to_charlist/1
**(UnicodeConversionError)从处开始的编码无效
(elixir)lib/string.ex:2035:string.to_charlist/1
现在,如果去掉第一个字节,然后依次尝试:
String.to_charlist <<99, 111, 114, 94, 51, 94, 51, 94, 66, 52, 57, 49, 49, 49, 32, 32, 49, 48, 51, 53, 94, 67, 79, 77, 80, 76, 69, 84, 69, 68, 94, 49, 49, 52, 50, 52, 53, 94, 75>>
String.to\u字符列表
你会得到:
'cor^3^3^B49111035^已完成^114245^K'
是否有其他方法可以将这些字节转换为字符串?我知道有些字符,如169,可能无法显示,但建议如何处理这些字符
谢谢你的帮助
我确实发现:
<<169 :: utf8, 0>>
返回值,其中添加了194。因此,如果将其粘贴到iex中,输出似乎是正确的
<<194, 169, 99, 111, 114, 94, 51, 94, 51, 94, 66, 52, 57, 49, 49, 49, 32, 32, 49, 48, 51, 53, 94, 67, 79, 77, 80, 76, 69, 84, 69, 68, 94, 49, 49, 52, 50, 52, 53, 94, 75>>
我是否需要编写一个函数,循环遍历字节并调用返回的字节(0 concat除外)
字符串。to_charlist/1
首先是冗余的:
String.to_charlist <<99, 111, 114, 94, 51, 94, 51, 94>>
不幸的是,您收到的不是utf8
编码,Elixir没有内置工具在编码之间转换二进制文件。您不能只删除有意义的符号
我建议使用软件包进行转换:
Codepagex.from_string(<<99, 111, 114, 94, 51, 94, 51, 94>>, :iso_8859_1)
#⇒ "cor^3^3^"
使用理解的另一个解决方案:
to_string(for <<c :: 8 <- <<169, 99, 111, 114, 94, 51, 94, 51, 94>> >>, do: c)
#⇒ "©cor^3^3^"
to\u string(对于从\u string传入的字节不包含169。我尝试了以下操作:Codepagex.from\u string(,:iso\u 8859\u 1)
,收到:{:error,“编码无效字节”}
1.我已经更新了答案,可能您会坚持使用erlang解决方案。2.我不知道它的编码是什么。请尝试使用:latin1
而不是:iso_8859_1
,或者使用替换不存在的
,如他们的文档所示。谢谢您的帮助。我使用了您的解决方案。有趣的是,如果我传递相同的字节s作为to_string的charlist它工作得很好…非常奇怪..谢谢你的帮助:to_string[169,99,111,114,94,49,49,94]
欢迎。我已经用第三个变量(使用理解)更新了答案你怎么能用一个二进制参数调用String.to\u charlist
?在iex>h String中似乎没有任何东西。to\u charlist
允许这样做,也就是说:将字符串转换成一个charlist。一个二进制总是可以用于字符串参数吗?是的,我读到字符串是一个UTF-8编码的二进制,我刚刚试过“é”=
我得到了答案。
:unicode.characters_to_binary(
<<169, 99, 111, 114, 94, 51, 94, 51, 94>>, :latin1, :utf8
)
#⇒ "©cor^3^3^"
to_string(for <<c :: 8 <- <<169, 99, 111, 114, 94, 51, 94, 51, 94>> >>, do: c)
#⇒ "©cor^3^3^"