取消在Haskell字符串中找到的unicode文字

时间:2015-10-21 02:57:53

标签: haskell unicode rdf unicode-literals

小写s的unicode是U + 0073,this website在C和Java中是\u0073

给定一个文件:a.txt包含:

http://www.example.com/\u0073

让我们用Java阅读这篇文章,并转发\,看看我们得到了什么:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.commons.lang3.StringEscapeUtils;

public class Main {
  public static void main(String[] args) throws IOException {
    String s2 = new String(Files.readAllBytes(Paths.get("a.txt")));
    System.out.println(s2); // prints http://www.example.com/\u0073

    String s3 = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(s2);
    System.out.println(s3); // prints http://www.example.com/s
  }
}

输出结果为:

$ java -cp ./commons-lang3-3.4.jar:. Main
http://www.example.com/\u0073
http://www.example.com/s

unescapeJava(s2)方法调用从文件中取\\u0073,将unescapes转换为\u0073,然后打印成“s”。

我们可以在Haskell中做同样的事吗?

让我们使用文本库使用这两个文件:

Prelude > a <- Data.Text.IO.readFile "a.txt"
Prelude > a
"http://www.example.com/\\u0073\n"

对Haskell中从\u0073s的自动翻译的任何期望都会被\x而不是\u前缀混淆,以实现这样的期望:

Prelude> "\x0073"
"s"

那么如何在apace-common-lang中使用unescapeJava(..)方法,并在Haskell中复制其功能以从\\u0073转到\u0073,并将其打印为“s”

1 个答案:

答案 0 :(得分:6)

在您的示例中,ab不相等,因为生成它们的文件的内容不相等。

readFile使用&#34;运行时系统的区域设置,字符集编码和行结束转换设置来读取文件的文字内容。&#34; readFile不会解析W3C兼容(或任何其他)格式的数字或其他字符转义。角色&#34; \&#34;在文件中将始终作为文字&#34; \&#34;读取,并且永远不会作为转义序列的开头。我不确定你为什么会这样做,因为我不知道任何语言的标准库在阅读时会自动尝试解析文字&#34; \&#34; s到转义序列文件内容。

如果你想解析文字文本&#34; \ u0073&#34; (那是由Haskell显示的字符\u0073 as&#34; \\ u0073&#34;)作为字符s的数字转义符,您需要编写解析器或使用其他人编写的解析器。 readLitChar是一个解析器,但它使用Haskell约定,这与W3C定义的不同。但是,您可以看到lexCharE的基础构造,这可能有助于您编写自己的构造。