小写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中从\u0073
到s
的自动翻译的任何期望都会被\x
而不是\u
前缀混淆,以实现这样的期望:
Prelude> "\x0073"
"s"
那么如何在apace-common-lang中使用unescapeJava(..)
方法,并在Haskell中复制其功能以从\\u0073
转到\u0073
,并将其打印为“s”
答案 0 :(得分:6)
在您的示例中,a
和b
不相等,因为生成它们的文件的内容不相等。
readFile
使用&#34;运行时系统的区域设置,字符集编码和行结束转换设置来读取文件的文字内容。&#34; readFile
不会解析W3C兼容(或任何其他)格式的数字或其他字符转义。角色&#34; \&#34;在文件中将始终作为文字&#34; \&#34;读取,并且永远不会作为转义序列的开头。我不确定你为什么会这样做,因为我不知道任何语言的标准库在阅读时会自动尝试解析文字&#34; \&#34; s到转义序列文件内容。
如果你想解析文字文本&#34; \ u0073&#34; (那是由Haskell显示的字符\
,u
,0
,0
,7
,3
as&#34; \\ u0073&#34;)作为字符s
的数字转义符,您需要编写解析器或使用其他人编写的解析器。 readLitChar
是一个解析器,但它使用Haskell约定,这与W3C定义的不同。但是,您可以看到lexCharE
的基础构造,这可能有助于您编写自己的构造。