将UTF-8 iso-8859字节-字符串转换为字符列表

将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的奇怪问题

在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, 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^"