2015-05-06 12 views
5

Używam Java Scanner.Dlaczego ta postać powoduje uszkodzenie mojego skanera?

Mam plik .txt z zapisanym w nim tekstem.

PriceDB = { 
    ["profileKeys"] = { 
     ["Name - 回音山"] = "Name - 回音山", 
    }, 
    ["char"] = { 
     ["Name - 回音山"] = { 
      ["CurrentValue"] = "一口价:|cffffffff70,197|TInterface\\MoneyFrame\\UI-GoldIcon:0:0:2:0|t|r", 
     }, 
    }, 
} 

Wszystko staram się zrobić, to otworzyć ten plik za pomocą skanera i wyodrębnić "CurrentValue" z 70,197 z pliku i zapisać go jako int. Jednak za każdym razem, gdy plik jest otwierany, nie odczyta linii i wyśle ​​NoSuchElementException z komunikatem "No line found". Po obejrzeniu pliku i usunięciu niektórych chińskich znaków jeden po drugim zawęziłem go do tego małego faceta 口. Z jakiegoś powodu skaner nie lubi tej postaci. Zastanawiałem się tylko, czy jest jakieś ustawienie kodowania, które muszę zmienić, czy mam zamiar użyć BufferedReader, czy ... nie jestem do końca pewien, co się dzieje, chyba że jest błąd w kodowaniu. Więc co się tutaj dzieje?

Edytuj: Oto inicjalizacja mojego skanera.

Scanner scanner; 
if (region.equals("US")) { 
       scanner = new Scanner(new File("C:\\Program Files\\World of Warcraft\\WTF\\Account\\313023286#1\\SavedVariables\\WoWTokenPrice.lua")); 
      } else if (region.equals("EU")) { 
       scanner = new Scanner(new File("C:\\Program Files\\World of Warcraft\\WTF\\Account\\313495228#1\\SavedVariables\\WoWTokenPrice.lua")); 
      } else if (region.equals("China")) { 
       File file = new File("C:\\Program Files\\World of Warcraft\\WTF\\Account\\232241227#1\\SavedVariables\\WoWTokenPrice.lua"); 
       System.out.println(file.exists()); 
       scanner = new Scanner(file); 
      } else { 
       System.exit(1); 
       break; 
      } 

Po prostu skopiowałem to, jak jest. region == "Chiny"

+1

Idź przykładem swojego skanera? Interesuje mnie, czy kodowanie znaków jest odpowiednio ustawione. –

+0

Czy ustawiasz odpowiednie kodowanie? Jakie to jest kodowanie? A jaki jest kod kodowy Unicode dla "kłopotliwej postaci"? – Thilo

Odpowiedz

4

Musisz podać poprawne kodowanie podczas tworzenia swojego Scanner. Konstruktor:

public Scanner(InputStream source, String charsetName) 

Tworzy nowy skaner, który wytwarza wartości zeskanowane z określonego strumienia wejściowego. Bajty ze strumienia są konwertowane na znaki przy użyciu określonego zestawu znaków.

Find here your charset, chyba UTF-16, ale nie jest ekspertem w zagranicznych znaków :).

Scanner scanner = new Scanner(is, StandardCharsets.UTF-16.toString()); 
+0

Należy również zauważyć, że plik ten będzie zawierał także znaki z języka angielskiego, koreańskiego i tajwańskiego (nie znam tam tych języków). Czy UTF-16 obsługuje wszystkie te, które myślisz? – david2278

+0

[Sprawdź tutaj] (http://a4esl.org/c/charset.html) –

+1

Kodowanie UTF-16 kodeków Unicode, dlatego może oczywiście przechowywać znaki wszystkich języków w standardzie Unicode, który obecnie obejmuje większość języków. [Absolutne minimum Każdy programista absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)] (Http://www.joelonsoftware.com/articles/Unicode.html) –

Powiązane problemy