2009-12-22 7 views
20

Wenn Sie den Scala-Interpreter verwenden (d. H. Den Befehl 'scala' in der Befehlszeile ausführen), kann ich Unicode-Zeichen nicht korrekt drucken. Natürlich werden a-z, A-Z usw. korrekt gedruckt, aber beispielsweise wird € oder ƒ als ein? Gedruckt.Unicode vom Scala-Interpreter aus drucken

print(8364.toChar) 

Ergebnisse? anstelle von €. Wahrscheinlich mache ich etwas falsch. Mein Terminal unterstützt utf-8 Zeichen und selbst wenn ich die Ausgabe in eine separate Datei pipe und öffnen Sie sie in einem Texteditor,? wird angezeigt.

Dies geschieht alles auf Mac OS X (Snow Leopard, 10.6.2) mit Scala 2.8 (Nightly Build) und Java 1.6.0_17)

+0

In welchem ​​Betriebssystem laufen Sie den Interpreter? Und welche Scala-Version? –

+0

Hinzugefügt in meinem ursprünglichen Beitrag –

Antwort

16

ich die Ursache des Problems gefunden, und eine Lösung dafür, wie es sollte funktionieren. Wie ich bereits vermutet habe, nachdem ich meine Frage gepostet und die Antwort von Calum und Probleme mit dem Kodieren auf dem Mac mit einem anderen Projekt (das in Java war) gelesen habe, ist die Ursache des Problems die Standardkodierung von Mac OS X. Wenn du beginnst scala Interpreter, wird die Standardcodierung für die angegebene Plattform verwendet. Unter Mac OS X ist dies Macroman, unter Windows ist es wahrscheinlich CP1252. Sie können dies überprüfen, indem Sie den folgenden Befehl in dem scala-Interpreter eingeben:

scala> System.getProperty("file.encoding"); 
res3: java.lang.String = MacRoman 

Nach dem scala Hilfe Test ist es möglich, Java-Eigenschaften, um die -D-Option. Dies funktioniert jedoch nicht für mich. Ich beendete die Umgebungsvariable

Einrichtung
JAVA_OPTS="-Dfile.encoding=UTF-8" 

Nach scala ausgeführt wird, das Ergebnis des vorherigen Befehls wird das folgende Ergebnis geben:

scala> System.getProperty("file.encoding") 
res0: java.lang.String = UTF-8 

nun Druck Sonderzeichen wie erwartet funktioniert:

print(0x20AC.toChar)    
€ 

Also, es ist kein Fehler in Scala, aber ein Problem mit Standard-Kodierungen. Meiner Meinung nach wäre es besser, wenn standardmäßig UTF-8 auf allen Plattformen verwendet würde. Bei meiner Suche nach einer Antwort, wenn dies berücksichtigt wird, stieß ich auf eine discussion auf der Mailingliste Scala zu diesem Thema.In der ersten Nachricht wird vorgeschlagen, UTF-8 standardmäßig unter Mac OS X zu verwenden, wenn file.encoding Macroman meldet, da UTF-8 der Standardzeichensatz unter Mac OS X ist (frage mich, warum file.encoding standardmäßig auf Macroman gesetzt ist) Dies ist eine Vererbung von Mac OS bevor 10 veröffentlicht wurde?). Ich glaube nicht, dass dieser Vorschlag Teil von Scala 2.8 sein wird, seit Martin Odersky wrote, dass es wahrscheinlich am besten ist, die Dinge so zu halten, wie sie in Java sind (d. H. Ehre der file.encoding Eigenschaft).

+0

Um Sun zu zitieren: _Die Eigenschaft "file.encoding" wird von der J2SE-Plattformspezifikation nicht benötigt; Es ist ein internes Detail der Implementierungen von Sun und sollte nicht durch Benutzercode überprüft oder modifiziert werden. Es soll auch schreibgeschützt sein; Es ist technisch unmöglich, die Einstellung dieser Eigenschaft auf willkürliche Werte in der Befehlszeile oder zu einem anderen Zeitpunkt während der Programmausführung zu unterstützen._ http://bugs.sun.com/view_bug.do?bug_id=4163515 Also nicht unterstützt, funktioniert möglicherweise nicht auf allen JVMs und hat möglicherweise unbeabsichtigte Nebenwirkungen. – McDowell

+1

Eine Möglichkeit, dies zu tun und dabei das Problem zu vermeiden, dass McDowell-Flags System.out PrintStream (das immer noch als roher OutputStream funktioniert) mit einem PrintStream, der die von Ihnen gewünschte Kodierung verwendet, umschließen, wie "val myOut = neuer PrintStream (System.out, "UTF-8"); myOut.print (0x20AC.toChar) ". Dies sollte immer funktionieren. Ich würde dies bearbeiten, aber ich glaube nicht, dass ich das Karma für so etwas habe. – Calum

+1

@Calum - interessant zu sehen, ob das auf Macs funktioniert; Es funktioniert nicht sehr gut auf Windows, aber es kann ein plattformspezifisches Problem sein: http://illegalarumententexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html#charsets_javaconsole – McDowell

3

Ok, zumindest einen Teil, wenn nicht alle, Ihr Problem Hier ist, dass 128 nicht der Unicode-Codepoint für Euro ist. 128 (oder 0x80, da hex die Norm zu sein scheint) ist U+0080 <control>, d. H. Es ist kein druckbares Zeichen, daher ist es nicht überraschend, dass Ihr Terminal Probleme beim Drucken hat.

Euro der Codepunkt ist 0x20AC (oder in Dezimal-8364), und das scheint zu funktionieren für mich (ich bin auf Linux, auf einer nächtlichen von 2,8):

scala> print(0x20AC.toChar) 
€ 

Ein weiterer Spaß-Test ist die drucken Unicode-Schneemann-Zeichen:

scala> print(0x2603.toChar) 
☃ 

128 € ist anscheinend ein erweitertes Zeichen von einer der Windows-Codepages.

bekam ich die anderen Zeichen, das Sie arbeiten erwähnt:

scala> 'ƒ'.toInt 
res8: Int = 402 

scala> 402.toChar 
res9: Char = ƒ 
+0

Sie haben Recht in Bezug auf die falsche Nummer für das Euroo-Symbol. Jedoch funktioniert es immer noch nicht für mich: scala> drucken (0x20AC.toChar) ? Aber wenn es in Ihrer Nacht funktioniert, ist es wahrscheinlich ein Problem mit meinem System oder vielleicht ist es in neueren Scala 2.8 Builds behoben. Ich werde eine Untersuchung weiter aktualisieren. –

+0

Ich überprüfte dies auf dem heutigen Abend (2.8.0.r20300-b20091223020158) und 'print (0x20AC.toChar)' druckt ein Fragezeichen wie alle anderen 2.8 Versionen, die ich herumliegen habe. – p3t0r

+0

Ich bin auf OSX 10.6.2 übrigens. – p3t0r

0

für Windows in der Befehlszeile (cmd) Druck:

  1. set JAVA_OPTS="-Dfile.encoding=UTF-8"
  2. chcp 65001

Punkt 2 bedeutet, UTF-8

Wenn Sie "nicht jedes Mal drucken möchten chcp 65001 "können Sie den Wert in der Windows-Registrierung folgendermaßen ändern/hinzufügen:

  1. Befehl Ausführen regedit
  2. Fund record [HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor]
  3. New => String-Wert
  4. Name = "AutoRun", Data = "chcp 65001" (ohne Anführungszeichen)

(siehe https://superuser.com/a/482117/454417)

verwende ich Windows 10 und scala 2.11.8

Verwandte Themen