gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:56:44 25 4
gpt4 key购买 nike

小写的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com