Юникод для нижнего регистра s
U + 0073, который this website говорит: \u0073
в C и Java.Unescaping unicode литералы, найденные в Haskell Strings
Учитывая файл: 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"
Любое ожидание автоматического перевода с \u0073
на s
в Haskell можно спутать по \x
, а не \u
префиксом для проведения таких ожиданий:
Prelude> "\x0073"
"s"
Как я могу принять метод unescapeJava(..)
в apace-common-lang и воспроизвести его функциональность в Haskell, чтобы перейти от \\u0073
до \u0073
, и напечатать это как «s»?
Можете ли вы показать эквивалентный пример * чтения файла * на C или Java и преобразование '\ u0073' в' c'? Я был бы невероятно удивлен, если бы любой язык, включая C, Java или Haskell, интерпретировал «\» как escape-символ * при чтении файла *. –
С другой стороны, буква «http: //a.example/ \ x0073» * * совпадает с «http: // a.example/s "(используя' OverloadedStrings'). Единственное отличие состоит в том, что Haskell использует «\ x» в качестве префикса числового escape-кода для шестнадцатеричного символа. –
Строковый литерал «s» равен «\ x0073», а не «\\ u0073», последний - это просто символы '\ u 0 0 7 3'. Если вы хотите эту функциональность, вам нужно реализовать ее самостоятельно, хотя похоже, что вы хотите разобрать какой-то язык разметки, для чего существует множество библиотек. – user2407038