【问题标题】:Broken utf8 conversion?破坏了utf8转换?
【发布时间】:2015-05-08 06:05:51
【问题描述】:

我正在尝试像这样强制使用 UTF-8:

to_utf8(X) when is_list(X) ->
    unicode:characters_to_binary(X, utf8);
to_utf8(X) when is_binary(X) ->
    to_utf8(binary_to_list(X));
to_utf8(X) -> X.

并像这样测试它:

<<"é"/utf8>> = to_utf8(<<"é">>),
<<"Ø"/utf8>> = to_utf8(<<"Ø">>),
<<"œ"/utf8>> = to_utf8(<<"œ">>),

使用 R16B03 时一切正常。然而,在升级到 Erlang 17.5 后,该函数停止对诸如“œ”或“Ā”之类的字符起作用,即使它们在 UTF-8 中可用

由于 R17 使用 utf-8 作为默认编码,而不是 R16 的 latin-1,这应该和以前一样工作。

我是否忽略了什么?

谢谢:)

【问题讨论】:

    标签: erlang


    【解决方案1】:

    我将在下面的示例中使用œ 作为示例 unicode 字符:

    <<197,147>>         = <<"œ"/utf8>>.
    [197,147]           = binary_to_list(<<"œ"/utf8>>).
    <<195,133,194,147>> = unicode:characters_to_binary(binary_to_list(<<"œ"/utf8>>), utf8).
    

    在 R17 之前,latin1 的默认编码允许它与binary_to_list/1 一起工作。新的默认值为unicode

    列表[197,147] 不是unicode:characters_to_binary/2 中隐含的输出编码unicode 所期望的格式。如果我们想使用binary_to_list/1,我们必须指定输出编码应该是latin1,这是R16及以下的默认值:

    <<197,147>> = unicode:characters_to_binary(binary_to_list(<<"œ"/utf8>>), latin1, latin1).
    

    另一种解决方案是使用unicode:characters_to_list/1 而不是binary_to_string

    [339]       = unicode:characters_to_list(<<"œ"/utf8>>).
    <<197,147>> = unicode:characters_to_binary(unicode:characters_to_list(<<"œ"/utf8>>), utf8).
    

    更好的解决方案是直接使用unicode:characters_to_binary/1,2,3,因为不需要将二进制文件转换为列表:

    <<"œ"/utf8>> = unicode:characters_to_binary(<<197,147>>).
    <<"œ"/utf8>> = unicode:characters_to_binary("œ").
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多