2016-07-31 8 views
0

Verwendung von Mac OSX und wenn es eine Datei mit UTF-8 kodiert (enthält internationale Zeichen neben ASCII), fragen, ob irgendwelche Werkzeuge oder einfache Befehl (zB in Python 2.7 oder Shell) können wir die zugehörigen hex (base-16) -Werte (in Byte-Stream) finden? Wenn ich zum Beispiel asiatische Zeichen in die Datei schreibe, kann ich den zugehörigen Hex-Wert finden.erhalten UTF-8 codierten Hex-Wert für internationale Zeichen

Meine aktuelle Lösung ist ich öffne die Datei und lese sie Byte für Byte mit Python str. Fragen, ob irgendwelche einfacheren Möglichkeiten ohne Codierung. :)

Edit 1, es ist die Ausgabe von od scheint nicht korrekt ist,

cat ~/Downloads/12 
1 

od ~/Downloads/12 
0000000 000061 
0000001 

Edit 2 versuchte od -t x1 Optionen auch,

od -t x1 ~/Downloads/12 
0000000 31 
0000001 

Vielen Dank im Voraus, Lin

+1

nicht sicher, was Sie durch "related hex" bedeutet in diesem Fall. Mit der Terminal.app in Mac OS X mit einer Bash-Shell ist es einfach, nach Unicode-Zeichen außerhalb des US-ASCII-Bereichs zu suchen. Etwas wie: 'grep 中国 cn.txt' Versuchen Sie, linguistisch ähnliche Zeichen zu finden, in der Nähe eines Codepunktbereichs oder etwas anderem? –

+0

@LexScarisbrick, schönes Beispiel. Der Hex-Wert I bedeutet die realen Byte-Werte, die als UTF-8 codiert sind. Der Grund, warum ich Hexadezimalwert erhalten möchte, liegt darin, dass ich möglicherweise in Python 2.7 Variablenwerte wie '\ xE3 \ x80 \ x82' zuweisen muss, die die Byte-Werte Hex-Form für ein Unicode-Zeichen sind. Ich mache nicht Grep. Wenn Sie irgendwelche Ideen haben, wird es großartig. –

+1

'od' ist das POSIX-Hex-Dump-Tool. Keine Programmierfrage; Wählen zu schließen. – tripleee

Antwort

1

od ist der richtige Befehl, aber Sie müssen ein optionales Argument angeben -t x1:

$ od -t x1 ~/Downloads/12 
0000000 31 
0000001 

Wenn Sie nicht lieber die Datei sehen Offsets, versuchen -A none fügte hinzu:

$ od -A none -t x1 ~/Downloads/12 
31 

Zusätzlich Linux-man-Seite (aber nicht die OS X Mann pag e) listet dieses Beispiel auf: od -A x -t x1z -v, "Display hexdump format output."

Referenz: http://www.unix.com/man-page/osx/1/od/

+0

Danke Robᵩ, wähle ab. Ich poste die Befehlsausgabe in Edit 2 Sektion, denke, dass die Ausgabe nur "31" sein sollte, was bedeutet '0000000' und' 0000001'? –

+1

Das sind die Offsets in die Datendatei. Die erste Zeile repräsentiert Offset 0, die nächste leere Zeile das Ende der Datei bei Offset 1. Probieren Sie eine größere Datei aus, um zu sehen, wie diese Offsets funktionieren. Wenn Sie die Offsets nicht sehen möchten, fügen Sie '-A keine hinzu. –

+0

Danke Robᵩ, deine Lösung funktioniert. Stimme ab und markiere deine Antwort als Antwort. –

0

Sie können verwenden der Befehl zum Konvertieren zwischen Codierungen. Der grundlegende Befehl lautet:

und Sie können eine Liste der unterstützten Kodierungen mit

iconv --list 

In Ihrem Fall

iconv -f UTF8 -t UCS-2 inputfile 

Sie haben auch gebeten, die Hex-Werte zu sehen . Ein Standard-Dienstprogramm, das dies tun wird, ist xxd. Sie können die Ergebisse von iconv-xxd wie folgt:

iconv -f UTF8 -t UCS-2 inputfile | xxd 
+0

Dank borrible, vote up. Ich muss nicht konvertieren, ich muss nur seine vorhandenen Hex-Werte sehen. Willst du bestätigen, dass es das ist, was ich brauche? Vielen Dank. –

+1

Der Titel Ihrer Frage sieht so aus, wie Sie es wünschen, aber die tatsächliche Frage scheint nicht zu sein. Wir können es nicht wirklich wissen, oder? – tripleee

+0

@tripleee, schöner Fang. Ich lese meinen Titel noch einmal und aktualisiere ihn. Stimme für deine Empfehlungen ab. –

2

Ich bin nicht sicher genau, was Sie wollen, aber das Skript können Sie die Unicode-Codepoint und UTF-8-Byte-Sequenz für ein beliebiges Zeichen nachschlagen helfen. Achten Sie darauf, die Quelle als UTF-8 zu speichern.

# coding: utf8 
s = u'我是美国人。' 
for c in s: 
    print c,'U+{:04X} {}'.format(ord(c),repr(c.encode('utf8'))) 

Ausgang:

我 U+6211 '\xe6\x88\x91' 
是 U+662F '\xe6\x98\xaf' 
美 U+7F8E '\xe7\xbe\x8e' 
国 U+56FD '\xe5\x9b\xbd' 
人 U+4EBA '\xe4\xba\xba' 
。 U+3002 '\xe3\x80\x82' 
+0

Danke Mark, stimm auf. –

Verwandte Themen