Erlang在Linux终端打印UTF-8字符显示编码而非原字符的解决求助
解决Erlang在Linux终端打印UTF-8字符的问题
问题原因
你当前代码里的Text = "あいうえお"在Erlang中是Unicode代码点的整数列表(比如"あ"对应整数12354,即0x3042)。使用~ts格式符时,若Erlang输出编码未匹配终端UTF-8设置,会默认输出代码点的转义序列\x{3042},而非实际字符。
解决方案
方法1:转换为UTF-8二进制后输出
通过unicode:characters_to_binary/2将Unicode代码点列表转成UTF-8编码的二进制,再用~s格式符输出(~s用于打印字节序列):
-module('main'). -export([main/1]). main(_) -> Text = "あいうえお", % 将Unicode代码点列表转换为UTF-8二进制 Utf8Bin = unicode:characters_to_binary(Text, utf8), io:format("~s~n", [Utf8Bin]), halt().
方法2:用io:put_chars直接输出UTF-8
io:put_chars/3可指定编码直接输出字符列表,无需手动转换:
-module('main'). -export([main/1]). main(_) -> Text = "あいうえお", % 指定Unicode编码和输出格式为UTF-8 io:put_chars(unicode, utf8, Text), io:nl(), % 换行 halt().
验证运行
编译运行修改后的代码:
$ erlc main.erl $ erl -noshell -run main main run あいうえお
补充说明
- 你之前尝试的
list_to_bin无效,因为它只是把整数列表直接转成二进制(每个代码点占2字节大端),而非UTF-8编码的3字节格式。 - Ubuntu 22.04终端默认支持UTF-8,只要输出正确的UTF-8字节流,就能正常显示日文字符。
内容的提问来源于stack exchange,提问作者klsn
相关产品推荐
相关产品推荐

