`
litaocheng
  • 浏览: 337721 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang的Unicode支持

阅读更多
在R13A中, Erlang加入了对Unicode的支持。本文涉及到的数据类型包括:list, binary, 涉及到的模块包括stdlib/unicode, stdlib/io, kernel/file。
Binary

Binary的type属性增加了utf相关的type:utf8, utf16, utf32,其分别对应UTF8, UTF16,UTF32编码。

Binary Constructing

在Binary构建时, 如果指定了utf相关类型,那么对应的integer的Value必须位于:0..16#D7FF, 16#E000..16#FFFD, 或者 16#10000..16#10FFFF这三个区间中。否则将会提示'bad argument',参数错误。根据指定的的utf类型不同,同一个数据产生的binary不同。

对于utf8,每个integer生成1到4个字符;对于utf16,每个integer生成2或4个字符;对于utf32,每个integer生成4个字符。

比如, 使用unicode为1024的字符A,  构建一个binary:

1> <<1024/utf8>>.    
<<208,128>>
2> <<1024/utf16>>.
<<4,0>>
3> <<1024/utf32>>.
<<0,0,4,0>>


Binary Match

当进行Binary Match时,如果指定utf相关类型,变量成功匹配后,将拥有一个位于:0..16#D7FF, 16#E000..16#FFFD, 或者 16#10000..16#10FFFF这三个区间中的integer。

其更具utf类型的不同,消耗(match)不同数目的bytes。

utf8匹配1-4个bytes(参考RFC-2279)
utf16匹配2 或 4 个bytes (参考 RFC-2781)
utf32匹配4个 bytes

比如:继续我们上面的例子

4> Bin = <<1024/utf8>>.
<<208,128>>
5> <<U/utf8>> = Bin.
<<208,128>>
6> U.
1024


这个例子中,U匹配了2个bytes。

对于utf相关类型,不能指定unit spec

List

在list中,每个unicode字符采用integer来表示,因此与latin1的list相比,unicode list中,element的数值可以大于255。
下面就是一个有效的unicode list: [1024, 1025]

我们可以通过unicode 模块实现 list到binary的转换。

unicode module

首先请参看下面的type定义:

unicode_binary() = binary() with characters encoded in UTF-8 coding standard
unicode_char() = integer() representing valid unicode codepoint
chardata() = charlist() | unicode_binary()
charlist() = [unicode_char() | unicode_binary() | charlist()]
a unicode_binary is allowed as the tail of the list

external_unicode_binary() = binary() with characters coded in a user specified Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
external_chardata() = external_charlist() | external_unicode_binary()
external_charlist() = [unicode_char() | external_unicode_binary() | external_charlist()]
an external_unicode_binary is allowed as the tail of the list

latin1_binary() = binary() with characters coded in iso-latin-1
latin1_char() = integer() representing valid latin1 character (0-255)
latin1_chardata() = latin1_charlist() | latin1_binary()
latin1_charlist() = [latin1_char() | latin1_binary() | latin1_charlist()]
a latin1_binary is allowed as the tail of the list


我们可以调用unicode:characters_to_list/1 将chardata或latin1_chardata或external_chardata()转化成一个unicode list。

如果参数为latin1_chardata,那么Data参数就是一个iodata. 返回的结果list中,每个element为一个integer。默认情况 unicode:characters_to_list/1调用unicode:characters_to_list(Data, unicode)

如果我们的CharData为其他类型,我们可以指明InEncoding type。如果此函数执行成功,返回{ok, List}, 如果失败返回{error, list(), RestData}, 其中list为转化成功的部分,RestData为发生错误的位置。

我们也可以调用unicode:characters_to_binary/1,将chardata或latin1_chardata或external_chardata()转化成一个binary。这个函数和unicode:characters_to_list类似,只是结果保存为binary。

如果Data为latin1_chardata, 那么unicode:characters_to_binary/1和 erlang:iolist_to_binary/1功能相同

unicode模块中,还有两个于bom相关的函数,可以根据bom指返回对应的encoding类型,也可以根据encoding类型生成对应的bom值。其在保存文件时,经常使用.

Examples

1, 打开utf8保存的文件
  文件内容如下test.file:
[
{desc, "这是一个测试文件"},
{author, "litaocheng"}
].

其格式为erlang term,保存时选择utf8编码。
代码如下:


%% read content from the file
test1() ->
    {ok, [Terms]} = file:consult("test.txt"),
    Desc = proplists:get_value(desc, Terms),
    _Author = proplists:get_value(author, Terms),
    
    % out put the Desc and Author
    DescUniBin = iolist_to_binary(Desc),
    DescUniList = unicode:characters_to_list(DescUniBin),
    io:format("desc bin : ~ts~ndesc bin : ~p~n",[DescUniBin, DescUniBin]),
    io:format("desc list: ~ts~ndesc list: ~p~n", [DescUniList, DescUniList]).


结果:
desc bin : 这是一个测试文件
desc bin : <<232,191,153,230,152,175,228,184,128,228,184,170,230,181,139,232,
             175,149,230,150,135,228,187,182>>
desc list: 这是一个测试文件
desc list: [36825,26159,19968,20010,27979,35797,25991,20214]

首先将内容从list转换为binary, DescUniBin 便是对应的unicode binary。随后通过unicode:characters_to_list/1转化为unicode list最后输出。
我们可以看到 unicode list中所有的element为integer, unicode binary中unicode string采用uft8编码。

2, 将数据保存成uft8格式

%% save the binary in utf8 format
test2() ->
    [DescList] = io_lib:format("~ts", ["这是一个测试文件"]),
    DescBin = erlang:iolist_to_binary(DescList),
    DescList2 = unicode:characters_to_list(DescBin),
    List = lists:concat(["[{desc,\"", DescList2, "\"}, {author, \"litaocheng\"}]."]),
    Bin = unicode:characters_to_binary(List),
    io:format("bin is:~ts~n", [Bin]),
    file:write_file("test_out.txt", Bin).



Update:
2008.5.4:
[DescList] = io_lib:format("~ts", ["这是一个测试文件"])
在erlang shell中DescList为:[36825,26159,19968,20010,27979,35797,25991,20214]
在module文件中,DescList为:
[232,191,153,230,152,175,228,184,128,228,184,170,230,181,139,232,175,
          149,230,150,135,228,187,182]


分享到:
评论
3 楼 techabc 2009-05-26  
据 http://blog.csdn.net/laome  :
R13B的unicode支持在erlang shell中是ok的,但erlang编译器处理却有缺陷……
2 楼 litaocheng 2009-05-04  
呵呵,很少在windows下搞...
linux一切ok
1 楼 k1000j1000 2009-04-15  
可惜现在在windows中的erlang sheel还不能正常显示utf的中文。

相关推荐

    Erlang UTF-8 转 Unicode 的字典程序

    在处理字符编码时,Erlang支持多种编码格式,其中包括UTF-8和Unicode。在Erlang中,UTF-8是一种常见的用来表示Unicode字符的编码方式,因为它既能有效地存储大多数常见字符,又具有良好的向后兼容性。 在Erlang R14...

    erlang 20.3.zip

    5. **Unicode增强**:Erlang 20.3对Unicode字符串处理进行了加强,支持更多的Unicode特性。 6. **R19向R20迁移的兼容性**:确保了从旧版本到20.3的平滑迁移,减少了升级过程中的兼容性问题。 在使用这个压缩包安装...

    erlang64位win安装20.3

    2. **Unicode支持增强**:对Unicode字符串处理进行了优化,更好地支持多语言应用。 3. **erts(Erlang Run-Time System)增强**:提升了并发性能和错误处理能力。 4. **Rebar3**:Erlang的构建工具Rebar3在这个版本...

    erlang-23.2.3-1.el7.x86_64.rpm和erlang-23.2.1-1.el7.x86_64.rpm.rar

    Erlang 23引入了一些新特性,例如改进的错误处理、新的模块加载机制和对Unicode的更好支持。RabbitMQ 3.8.17则可能包含了一些安全修复、性能提升和功能增强。 在实际部署中,确保Erlang版本与RabbitMQ版本兼容至关...

    linux下erlang22版本和rabbitmq3.7版本

    5. **Unicode支持**:加强了Unicode字符串处理,使得处理多语言文本更为便捷。 RabbitMQ 3.7版本主要特性包括: 1. **高可用性**:支持镜像队列,确保即使节点故障,消息也不会丢失,提升了服务的可靠性。 2. **...

    erlang lib of iconv

    - `iconv_list()`:返回一个列表,包含所有Erlang iconv库支持的字符编码。 4. **使用示例** 假设我们有一个UTF-8编码的字符串,需要转换为GBK编码,可以这样操作: ```erlang {Descriptor, _} = iconv:open(...

    esl-erlang_22.0~windows_amd64.exe.7z

    9. **文本编码:**Erlang默认使用Unicode(UTF-8)编码,方便处理各种字符集。 这个"esl-erlang_22.0~windows_amd64.exe.7z"文件是Erlang的压缩包,采用7-Zip压缩格式。7-Zip是一种开源的文件压缩软件,提供更高的...

    erlang 中文乱码

    3. **终端设置**:如果你在终端中查看Erlang的输出,确保你的终端环境支持UTF-8,并且已经将其设置为默认的字符编码。不同的操作系统有不同的设置方法,如在Linux中修改`.bashrc`文件,或者在Windows中设置控制台...

    Erlang otp_win64_21和22版本 exe

    - **语言增强**:可能增加了新的语言特性,比如Erlang 22引入了更多Unicode支持和改进的类型注解。 - **库和工具更新**:新版本可能包含对现有库和工具的升级,以保持与最新技术同步。 - **错误修复**:修复了旧...

    erlang-otp windows 64位 22.0

    Erlang OTP 22.0版引入了一些关键改进和新特性,例如增强了类型检查,提高了编译速度,优化了内存管理,以及对Unicode字符集的支持。这些改进提升了开发者的效率,并使系统运行更加高效稳定。 标签中提到的...

    rabbitmq3.7.14和erlang22.1.rar版本匹配

    关于Erlang 22.1,这是一个稳定版本,引入了多项改进和新特性,包括性能优化、错误修复和对Unicode字符集的支持增强。在与RabbitMQ 3.7.14配合时,它能提供良好的运行环境,保证RabbitMQ的各项功能正常运行,如消息...

    Erlang Reference Manual

    Erlang 支持多种字符集,包括 ASCII 和 Unicode。文档中详细介绍了字符集的选择及其对程序开发的影响。 #### 1.2 数据类型 **1.2.1 术语(Terms)** 术语是 Erlang 中数据的基本单位,它可以是任何类型的值,包括...

    otp_src_20.0.tar.zip

    3. **Unicode支持**:Erlang在20.0版本中可能加强了对Unicode字符的支持,使得处理多语言文本更加方便。 4. **模块和库更新**:OTP库可能包含了新的模块或对现有模块的增强,以适应不断发展的技术需求,如网络通信...

    otp_win64_22.0 最新官方.zip

    首先,Erlang 22.0 引入了对Unicode 11.0的支持,这使得处理各种语言和字符集变得更加简单,尤其是在全球化项目中。Unicode 11.0包含了更多的表情符号和罕见的字符,使得软件的本地化工作更加全面。 其次,Erlang ...

    otp_win64_21.1.zip

    例如,它可能引入了对最新版Java虚拟机(JVM)的支持,提升了与Java交互的能力;可能增强了对Unicode字符集的处理,使得处理多语言文本更为方便;还可能对内存管理、性能优化等方面进行了优化,提供了更好的并发性和...

    Tentative new functions in R13B

    8. Unicode支持:通过EEP-10文档,Erlang引入了对Unicode的支持。这是国际化和本地化应用开发中的一个重要特性,允许处理包括多语言文本在内的复杂场景。 9. 在二进制数据中快速搜索:这是一个针对性能优化的功能,...

    publicsuffix-erl:从给定的主机名URL中提取顶级域(TLD)

    受 (但也支持Unicode TLD)和启发。 要求 Erlang 17.0或更高版本(也应在R16上工作,但尚未经过测试) GNU make 安装 git clone https://github.com/Mendor/publicsuffix-erl.git cd publicsuffix-erl make 用法 ...

    Flagmojis:一个Elixir微型库,可轻松查找国家emoji表情标志信息,包括ISO,Unicode,Emoji和名称

    Elixir是一种函数式编程语言,它运行在BEAM虚拟机上,与 Erlang 共享生态系统。Elixir以其并发性、可扩展性和容错性而闻名,常用于构建高可用性的分布式系统。在Elixir中,Flagmojis库可以作为一个轻量级的依赖,...

Global site tag (gtag.js) - Google Analytics