在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. 1> <<1024/utf8>>.
  2. <<208,128>>
  3. 2> <<1024/utf16>>.
  4. <<4,0>>
  5. 3> <<1024/utf32>>.
  6. <<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

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

  1. 4> Bin = <<1024/utf8>>.
  2. <<208,128>>
  3. 5> <<U/utf8>> = Bin.
  4. <<208,128>>
  5. 6> U.
  6. 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编码。 
代码如下:

  1. %% read content from the file
  2. test1() ->
  3. {ok, [Terms]} = file:consult("test.txt"),
  4. Desc = proplists:get_value(desc, Terms),
  5. _Author = proplists:get_value(author, Terms),
  6. % out put the Desc and Author
  7. DescUniBin = iolist_to_binary(Desc),
  8. DescUniList = unicode:characters_to_list(DescUniBin),
  9. io:format("desc bin : ~ts~ndesc bin : ~p~n",[DescUniBin, DescUniBin]),
  10. 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格式

  1. %% save the binary in utf8 format
  2. test2() ->
  3. [DescList] = io_lib:format("~ts", ["这是一个测试文件"]),
  4. DescBin = erlang:iolist_to_binary(DescList),
  5. DescList2 = unicode:characters_to_list(DescBin),
  6. List = lists:concat(["[{desc,\"", DescList2, "\"}, {author, \"litaocheng\"}]."]),
  7. Bin = unicode:characters_to_binary(List),
  8. io:format("bin is:~ts~n", [Bin]),
  9. 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]

Erlang的Unicode支持的更多相关文章

  1. vc6下unicode支持

    最近在研究一个串口程序,要启用unicode支持,发现还挺麻烦的. VC6.0设定UNICODE编译环境 VC++ 6.0支持Unicode编程,但默认的是ANSI,所以开发人员只需要稍微改变一下编写 ...

  2. moodle3.15+,mysql完全的Unicode支持配置

    https://docs.moodle.org/dev/Releases,moodle个版本升级的主要内容和改动 在windows是mysql.ini  linux 下是mysql.cnf 因为MyS ...

  3. win32 UNICODE 支持

    #include <string> #ifdef _UNICODE #define tstring std::wstring #define __T(quote) L##quote #el ...

  4. [Erlang 0124] Erlang Unicode 两三事 - 补遗

    最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...

  5. UNICODE并没有提供对诸如Braille, Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持

    UNICODE支持欧洲.非洲.中东.亚洲(包括统一标准的东亚象形汉字和韩国象形文字).但是,UNICODE并没有提供对诸如Braille, Cherokee, Ethiopic, Khmer, Mon ...

  6. Python: subprocess.Popen()不支持unicode问题解决

    起源: 所下载视频,有音视频分离者,需要合并起来,采用python之subprocess.Popen()调用ffmpeg实现.python版本为2.7.13,而音视频文件路径,有unicode字符者, ...

  7. [Erlang 0108] Elixir 入门

    Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...

  8. Erlang 不同版本内容

    OTP 22.0 Erlang/OTP 22是一个新的主要版本,具有新的特性和改进,同时也具有不兼容性. 要更深入地了解OTP 22发行版的亮点,您可以阅读我们的博客: http://blog.erl ...

  9. Unicode与JavaScript详解

    本文为转载内容 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 它从0开始,为每 ...

随机推荐

  1. ele.me在IOS浏览器端启动APP的技巧分析

    ele.me在IOS浏览器端启动APP的技巧分析 巧妙利用后台重定向,在schemes启动时提示用户打开,启动不了APP时能够及时跳转至下载页面. 避免报错页面的出现以及用户还没来的及选择就跳转到下载 ...

  2. 《HTML5权威指南》

    <HTML5权威指南> HTML元素: html字符实体 html全局属性 html base标签 用元数据元素说明文档 标记文字(第八章) 标记文字.组织内容.文档分节 表格元素 表单元 ...

  3. 前端tab页实例

    <div class="tabbable"> <ul class="nav nav-tabs padding-16"> <c:fo ...

  4. Unix时间戳转换成C#中的DateTime

    先交代一下应用场景:我们的软件需要做一个简单的有效期验证保护.初始的想法是 在本地将安装时间.启动时间.当前时间做比较,为了防止记录被修改,记录在注册表的特殊的地方并加密. 我使用了.net自带的rs ...

  5. Style绑定

    目的 style绑定可以添加或者移除DOM元素的样式值.这非常有用,例如,当值为负数时将颜色变为红色. (注:如果要修改CSS整个类,请使用css绑定) <div data-bind=" ...

  6. javascript静态页面传值的三种方法分享

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm 复制代码 代码如下: <input type="text" ...

  7. pip更换软件镜像源

    家里的网络访问某些国外网站.下载安装包的时候总是连接不上或者下载速度特别慢, pypi.python.org就是其中一个.所以,使用pip给Python安装软件时,经常出现错误.修改pip连接的软件库 ...

  8. php中的curl常用例子

    1.基本请求 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); ...

  9. 分布式版本控制系统Git-----4.Git 常用命令整理

    1. git init 初始化 git 目录 2. git add 添加文件 git add fileName       #添加指定文件 git add -i             #手工选择要添 ...

  10. Linux下安装awstats日志统计分析

    1. 下载安装 cd /data/software wget http://prdownloads.sourceforge.net/awstats/awstats-7.0-1.noarch.rpm 2 ...