haskell - 对 Haskell 字符串中发现的 unicode 文字进行转义

标签 haskell unicode rdf unicode-literals

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

给定一个文件: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从文件中转义为 \u0073 ,然后打印成“s”。

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

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

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

\u0073 自动翻译的任何期望至s在 Haskell 中可能会被 \x 混淆而不是\u实现此类期望的前缀:

Prelude> "\x0073"
"s"

那么我该如何获取unescapeJava(..) apace-common-lang 中的方法,并在 Haskell 中复制其功能以从 \\u0073 开始至\u0073 ,并将其打印为“s”?

最佳答案

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

readFile 使用“运行时系统的区域设置、字符集编码和行结束转换设置”读取文件的文字内容。 readFile 不会解析 W3C 兼容(或任何其他)形式的数字或其他字符转义。文件中的字符“\”将始终被读取为文字“\”,而不是作为转义序列的开头。我不确定为什么您期望这种行为,因为我不知道有任何语言的标准库在读取文件内容时自动尝试将文字“\”解析为转义序列。

如果您想解析文字文本“\u0073”(即字符\u0073,Haskell 将显示为“\\u0073”)作为字符的数字转义s,您将需要编写一个解析器或使用其他人编写的解析器。 readLitChar就是这样一个解析器,但是它使用Haskell约定,与W3C定义的不同。但是,您可以看到lexCharE的底层构造。 ,这可能会帮助您编写自己的内容。

关于haskell - 对 Haskell 字符串中发现的 unicode 文字进行转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33250184/

相关文章:

haskell - 如何在 Haskell 中编写一系列 printf 函数(调试打印等)

java - Java中如何将十六进制字节转换为Unicode

rdf - 无法通过本地定义的谓词提取 RDF 三元组

haskell - `loeb` 函数还能用来做什么?

unix - 如何安装 GHC 7.8.1 并为其分配不同的命令?

python - 统一码编码错误 : 'gbk' codec can't encode character: illegal multibyte sequence

uri - RDF 中使用的 URI 中是否允许使用 "query string"?

rdf - 如何在 RDF 中模拟营业时间

haskell - Haskell 中修改了 `break`?

javascript - 如何将日本国旗字符🇯🇵放入字符串中?