suchen

Heim  >  Fragen und Antworten  >  Hauptteil

macos - Was ist der Codierungsmechanismus einer Datei?

Ich habe zum Beispiel eine f.txt-Datei auf meinem Mac.
Darin sind die Daten „xE6x97A5“ enthalten – das chinesische Zeichen „日“ in utf-8-Kodierung

Dann habe ich Ultraedit verwendet, um f.txt als folgende Dateien zu speichern:

  1. f1.txt-Datei

    Der tatsächlich gespeicherte Inhalt ist „xE6x97A5“. Wenn Ultraedit ihn als gb18030-Kodierung interpretiert, wird er als verstümmelte Zeichen auf der Ultraedit-Oberfläche angezeigt. Danach wurde es als gb18030-codierte Datei gespeichert, aber beim Öffnen auf dem Mac-System war es UTF-8 und die Anzeige war normal.

  2. f2.txt-Datei

    Der tatsächlich gespeicherte Inhalt ist „xE6x97A5“, was als utf-8 interpretiert und dann als „日“ angezeigt wird

  3. f3.txt-Datei

    Direkt als gb18030-Kodierung speichern, dann ändert Ultraedit automatisch die Kodierung, dh ändert „xE6x97A5“ in „xC8xD5“. Dann öffnet vim die Datei und ruft die Interpretation der ASCII-Kodierung auf.

Hier stellt sich die Frage:

Da die tatsächlich gespeicherten Daten „xE6x97A5“ sind, warum interpretiert mein Editor sie als UTF-8-Kodierung? Was soll ich tun, wenn ich den verstümmelten Code von GBK erklären lassen möchte?
Fügt es eine Art Tag zum binären Header des Dokuments hinzu? Wenn ja, wie wird dieses Tag angezeigt?
Wird auf der Editorseite eine codierungsbasierte semantische Analyse durchgeführt?

怪我咯怪我咯2778 Tage vor751

Antworte allen(2)Ich werde antworten

  • 迷茫

    迷茫2017-05-16 16:39:24

    就拿 vim 来说吧

    一个文本文件,vim 打开的时候按某种编码A打开,转换成某种编码B,然后保存的时候转换成另一种编码C,其他文本编辑器类似,可能没有vim这么可以设置和自动完成。
    编码B:对于整个文件没有影响,只是事关显示的,就是vim与操作系统交互时候使用的编码。

    编码A:使用 set fileencodings=ucs-bom,utf-8,gbk,cp936,latin-1设置。vim 按照设置的顺序检查检测文件的编码。因为某些编码里不存在某些二进制序列的组合,所以如果检测到就认为不是这种编码,检查下一种编码,否则就认为是这一种。因为latin-1可以出现任何二进制序列的组合,所以如果放到第一个,那么将永远以latin-1显示。

    在一般的二进制文件里是不存在字符编码的标记的。但是Unicode里面有个特殊叫做零宽度空格(\FE\FF)而\FF\FE是不存在的编码,所以在Unicode的标准里可以人为的在开始加入这个字符(这个字符在任何字体下都是没有宽度的,在中文字符里面没有任何的效果跟没有一样,是为了照顾东南亚某些语言的显示而设置的)。这样就便于文本编辑器检查字符和字节顺序,但是在代码里include这种文件经常会出问题(这可是个大坑,编译器会认为这是一个非法字符,可是你又看不到)。

    编码Bset fileencoding=utf-8,保存时候使用的编码,保存的时候自动转换为另一种编码。但是如果一开始打开的时候就识别错了编码,再转换的时候一个不存在的字符也是不会完转换的。

    所以 f1.txt 另存为 gp18030 可能不会进行编码的转换。

    ”问题来了,我想要得到实际存储数据是"\xE6\x97\A5",但是用gb18030编码解释,该如何做?“ 这个是什么意思?

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-16 16:39:24

    文件编码就是实际以何种方式存储的代码规定,首先就回答你的问题,UTF8编码中是\xE6\x97\A5,你就不可能说采用GB18030编码结果还为\xE6\x97\A5字。

    编辑器识别文本文件编码有不同的方式,有的文件编码带有Magic头,可以直接识别其前几个字节来完成,不过大部分文本文件不带有此类识别码,完全靠编辑器通过上下文和使用者的语言环境进行猜测。

    Antwort
    0
  • StornierenAntwort