2015-10-21 5 views
3

Юникод для нижнего регистра 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»?

+3

Можете ли вы показать эквивалентный пример * чтения файла * на C или Java и преобразование '\ u0073' в' c'? Я был бы невероятно удивлен, если бы любой язык, включая C, Java или Haskell, интерпретировал «\» как escape-символ * при чтении файла *. –

+0

С другой стороны, буква «http: //a.example/ \ x0073» * * совпадает с «http: // a.example/s "(используя' OverloadedStrings'). Единственное отличие состоит в том, что Haskell использует «\ x» в качестве префикса числового escape-кода для шестнадцатеричного символа. –

+1

Строковый литерал «s» равен «\ x0073», а не «\\ u0073», последний - это просто символы '\ u 0 0 7 3'. Если вы хотите эту функциональность, вам нужно реализовать ее самостоятельно, хотя похоже, что вы хотите разобрать какой-то язык разметки, для чего существует множество библиотек. – user2407038

ответ

6

В вашем примере a и b не равны, потому что содержимое файлов, которые их создали, не равно.

readFile читает литеральное содержимое файла, используя «языковой стандарт системы исполнения, кодировку набора символов и параметры преобразования конца строки». readFile не будет анализировать числовые или другие символы в W3C-совместимой (или любой другой) форме. Символ «\» в файле всегда будет читаться как буква «\» и никогда не станет началом escape-последовательности. Я не уверен, почему вы ожидаете, что это будет вести себя иначе, поскольку я не знаю ни одного языка, стандартная библиотека которого автоматически пытается проанализировать литературные «\» в escape-последовательности при чтении содержимого файлов.

Если вы хотите разобрать дословный текст "\ U0073" (Это символы \, u, 0, 0, 7, 3, который будет отображаться на Haskell, как "\\ U0073") в числовой escape для персонажа s, вам нужно будет написать парсер или использовать тот, который написал кто-то еще. readLitChar - такой синтаксический анализатор, но он использует соглашение Haskell, которое отличается от того, что определяет W3C. Тем не менее, вы можете увидеть базовую конструкцию lexCharE, которая может помочь вам написать свой собственный.

+0

Даже ваше редактирование смущает * чтение файла * с помощью текстового или строкового * литерала *. –

+0

Еще раз спасибо. С тех пор я попытался разделить в вопросе различие между тем, что потребляется из файла, и тем, что я хотел бы сделать с потребляемой строкой. С тех пор я получил пример Java в вопросе, который показывает, чего я хотел бы достичь в Haskell. То есть, эквивалент метода 'unescapeJava (..)' из apache commons lang пакета Java. –