Character encoding 汉字的Erlang正则表达式匹配

Character encoding 汉字的Erlang正则表达式匹配,character-encoding,erlang,Character Encoding,Erlang,TL;博士: 如何使这项工作ццц’显然是不属于拉丁字符集的字符;有没有办法告诉re模块或整个系统使用不同的字符集来运行“strings” 原始问题(记录在案): 另一个“编程Erlang”问题) 在第16章中有一个关于从mp3文件中读取标签的示例。很有效,很好。但是,提供的模块lib_find中似乎存在一些缺陷,该模块具有搜索匹配文件路径的功能。这是一个有效的呼吁: 25> re:run("йцу.asd", xmerl_regexp:sh_to_awk("*.*"), [{captur

TL;博士:

如何使这项工作ццц’显然是不属于拉丁字符集的字符;有没有办法告诉re模块或整个系统使用不同的字符集来运行“strings”

原始问题(记录在案):

另一个“编程Erlang”问题)

在第16章中有一个关于从mp3文件中读取标签的示例。很有效,很好。但是,提供的模块lib_find中似乎存在一些缺陷,该模块具有搜索匹配文件路径的功能。这是一个有效的呼吁:

25> re:run("йцу.asd", xmerl_regexp:sh_to_awk("*.*"), [{capture, none}]). 
** exception error: bad argument
     in function  re:run/3
        called as re:run([1081,1094,1091,46,97,115,100],
                         "^(.*\\..*)$",
                         [{capture,none}])
此呼叫失败:

61> lib_find:files("../..", "*.mp3", true).   
["../../early/files/Veronique.mp3"]
具有讽刺意味的是,调查结果在Erlang自己的装置中找到了罪犯:

.kerl/builds/20.1/otp_src_20.1/lib/ssh/test/ssh_sftp_SUITE_data/sftp_tar_test_data_高兴

好的,这似乎意味着Erlang正在使用一个更严格的默认字符集,它不包括hánzì。有哪些选择?显然,我可以忽略这一点,继续我的研究,但我觉得我可以从这一点中学到更多,比如-我在哪里/如何修复默认字符集?我有点惊讶,默认情况下它不是UTF8,所以也许我走错了方向


谢谢

TL;医生:

UTF-8正则表达式可以通过使用选项
unicode
将正则表达式模式设置为unicode模式来访问。(请注意下面的字符串
“^(.\\\..*)$”
是调用
xmerl\u regexp:sh\u to\u awk/1
的结果)

从你的例子来看:

1> re:run("なにこれ.txt", "^(.*\\..*)$").
** exception error: bad argument
     in function  re:run/2
        called as re:run([12394,12395,12371,12428,46,116,120,116],"^(.*\\..*)$")
2> re:run("なにこれ.txt", "^(.*\\..*)$", [unicode]).
{match,[{0,16},{0,16}]}


哦,老兄,一开始我对二进制字符串感到惊讶-。。。但是当我想到“stuff”是一个假字符串时,虽然二进制文件是诚实的,但这一切都是有道理的。@alexakarpov所以“二进制文件是诚实的”有点撒谎(二进制表示法意味着上面的“匹配”匹配第15个字节,但那不是第15个词素),匹配“字符”也是一个谎言,因为1个字符并不意味着1个词素。词素是唯一的真理,这也是为什么它变得如此混乱的部分原因(因为没有人想用4个字节来表示1[A-Z]ASCII字符!)。所以我们有词素,它们可能是单个代码点或集群,或者是任何东西的混合体!啊!!但这比任何其他选择都糟糕,所以我们被卡住了。
1> re:run("なにこれ.txt", "^(.*\\..*)$").
** exception error: bad argument
     in function  re:run/2
        called as re:run([12394,12395,12371,12428,46,116,120,116],"^(.*\\..*)$")
2> re:run("なにこれ.txt", "^(.*\\..*)$", [unicode]).
{match,[{0,16},{0,16}]}
11> re:run("йцу.asd", "^(.*\\..*)$", [unicode, {capture, none}]).       
match
12> {ok, Pattern} = re:compile("^(.*\\..*)$", [unicode]).
{ok,{re_pattern,1,1,0,
                <<69,82,67,80,87,0,0,0,16,8,0,0,65,0,0,0,255,255,255,
                  255,255,255,...>>}}
13> re:run("йцу.asd", Pattern, [{capture, none}]).               
match
3> UnicodeBin = <<"この文書はUTF-8です。"/utf8>>.
<<227,129,147,227,129,174,230,150,135,230,155,184,227,129,
  175,85,84,70,45,56,227,129,167,227,129,153,227,128,130>>
4> UnicodeString = unicode:characters_to_list(UnicodeBin).  
[12371,12398,25991,26360,12399,85,84,70,45,56,12391,12377,
 12290]
5> io:format("~ts~n", [UnicodeString]).
この文書はUTF-8です。
ok
6> re:run(UnicodeString, "UTF-8", [unicode]).
{match,[{15,5}]}
7> re:run(UnicodeBin, "UTF-8", [unicode]).   
{match,[{15,5}]}
8> unicode:characters_to_binary(UnicodeString).
<<227,129,147,227,129,174,230,150,135,230,155,184,227,129,
  175,85,84,70,45,56,227,129,167,227,129,153,227,128,130>>
9> unicode:characters_to_binary(UnicodeBin).   
<<227,129,147,227,129,174,230,150,135,230,155,184,227,129,
  175,85,84,70,45,56,227,129,167,227,129,153,227,128,130>>