- 浏览: 337157 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
在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:
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
比如:继续我们上面的例子
这个例子中,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编码。
代码如下:
结果:
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格式
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]
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]
- unicode_test.tar.gz (638 Bytes)
- 下载次数: 70
评论
3 楼
techabc
2009-05-26
据 http://blog.csdn.net/laome :
R13B的unicode支持在erlang shell中是ok的,但erlang编译器处理却有缺陷……
R13B的unicode支持在erlang shell中是ok的,但erlang编译器处理却有缺陷……
2 楼
litaocheng
2009-05-04
呵呵,很少在windows下搞...
linux一切ok
linux一切ok
1 楼
k1000j1000
2009-04-15
可惜现在在windows中的erlang sheel还不能正常显示utf的中文。
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5316平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7672项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21889本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4595inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10740Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3730Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2991今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 4010经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5806最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5095因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3775从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6383说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6387好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3705前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3356好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9575Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6189Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5276并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3685就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4364在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
在处理字符编码时,Erlang支持多种编码格式,其中包括UTF-8和Unicode。在Erlang中,UTF-8是一种常见的用来表示Unicode字符的编码方式,因为它既能有效地存储大多数常见字符,又具有良好的向后兼容性。 在Erlang R14...
5. **Unicode增强**:Erlang 20.3对Unicode字符串处理进行了加强,支持更多的Unicode特性。 6. **R19向R20迁移的兼容性**:确保了从旧版本到20.3的平滑迁移,减少了升级过程中的兼容性问题。 在使用这个压缩包安装...
2. **Unicode支持增强**:对Unicode字符串处理进行了优化,更好地支持多语言应用。 3. **erts(Erlang Run-Time System)增强**:提升了并发性能和错误处理能力。 4. **Rebar3**:Erlang的构建工具Rebar3在这个版本...
Erlang 23引入了一些新特性,例如改进的错误处理、新的模块加载机制和对Unicode的更好支持。RabbitMQ 3.8.17则可能包含了一些安全修复、性能提升和功能增强。 在实际部署中,确保Erlang版本与RabbitMQ版本兼容至关...
5. **Unicode支持**:加强了Unicode字符串处理,使得处理多语言文本更为便捷。 RabbitMQ 3.7版本主要特性包括: 1. **高可用性**:支持镜像队列,确保即使节点故障,消息也不会丢失,提升了服务的可靠性。 2. **...
- `iconv_list()`:返回一个列表,包含所有Erlang iconv库支持的字符编码。 4. **使用示例** 假设我们有一个UTF-8编码的字符串,需要转换为GBK编码,可以这样操作: ```erlang {Descriptor, _} = iconv:open(...
9. **文本编码:**Erlang默认使用Unicode(UTF-8)编码,方便处理各种字符集。 这个"esl-erlang_22.0~windows_amd64.exe.7z"文件是Erlang的压缩包,采用7-Zip压缩格式。7-Zip是一种开源的文件压缩软件,提供更高的...
3. **终端设置**:如果你在终端中查看Erlang的输出,确保你的终端环境支持UTF-8,并且已经将其设置为默认的字符编码。不同的操作系统有不同的设置方法,如在Linux中修改`.bashrc`文件,或者在Windows中设置控制台...
- **语言增强**:可能增加了新的语言特性,比如Erlang 22引入了更多Unicode支持和改进的类型注解。 - **库和工具更新**:新版本可能包含对现有库和工具的升级,以保持与最新技术同步。 - **错误修复**:修复了旧...
Erlang OTP 22.0版引入了一些关键改进和新特性,例如增强了类型检查,提高了编译速度,优化了内存管理,以及对Unicode字符集的支持。这些改进提升了开发者的效率,并使系统运行更加高效稳定。 标签中提到的...
关于Erlang 22.1,这是一个稳定版本,引入了多项改进和新特性,包括性能优化、错误修复和对Unicode字符集的支持增强。在与RabbitMQ 3.7.14配合时,它能提供良好的运行环境,保证RabbitMQ的各项功能正常运行,如消息...
Erlang 支持多种字符集,包括 ASCII 和 Unicode。文档中详细介绍了字符集的选择及其对程序开发的影响。 #### 1.2 数据类型 **1.2.1 术语(Terms)** 术语是 Erlang 中数据的基本单位,它可以是任何类型的值,包括...
3. **Unicode支持**:Erlang在20.0版本中可能加强了对Unicode字符的支持,使得处理多语言文本更加方便。 4. **模块和库更新**:OTP库可能包含了新的模块或对现有模块的增强,以适应不断发展的技术需求,如网络通信...
首先,Erlang 22.0 引入了对Unicode 11.0的支持,这使得处理各种语言和字符集变得更加简单,尤其是在全球化项目中。Unicode 11.0包含了更多的表情符号和罕见的字符,使得软件的本地化工作更加全面。 其次,Erlang ...
例如,它可能引入了对最新版Java虚拟机(JVM)的支持,提升了与Java交互的能力;可能增强了对Unicode字符集的处理,使得处理多语言文本更为方便;还可能对内存管理、性能优化等方面进行了优化,提供了更好的并发性和...
8. Unicode支持:通过EEP-10文档,Erlang引入了对Unicode的支持。这是国际化和本地化应用开发中的一个重要特性,允许处理包括多语言文本在内的复杂场景。 9. 在二进制数据中快速搜索:这是一个针对性能优化的功能,...
受 (但也支持Unicode TLD)和启发。 要求 Erlang 17.0或更高版本(也应在R16上工作,但尚未经过测试) GNU make 安装 git clone https://github.com/Mendor/publicsuffix-erl.git cd publicsuffix-erl make 用法 ...
Elixir是一种函数式编程语言,它运行在BEAM虚拟机上,与 Erlang 共享生态系统。Elixir以其并发性、可扩展性和容错性而闻名,常用于构建高可用性的分布式系统。在Elixir中,Flagmojis库可以作为一个轻量级的依赖,...