Jak wyświetlić Unicode UTF-8 jako Unicode?

12

Mam niektóre pliki tekstowe zakodowane w UTF-8, które wyświetlają dziwne kody specjalne w Emacsie. Na przykład ten tekst:

In ista quaestione primo exponam quid Intelligendum est per hoc nomen „Deus”; secundo, answerebo ad quaestionem.

Tak wygląda w Emacsie:

wprowadź opis zdjęcia tutaj

Dzieje się tak tylko w Emacsie. Inni redaktorzy wyświetlają tekst poprawnie. Jak mogę rozwiązać ten problem?


Aktualizacja 1

Jeśli zadzwonię revert-buffer-with-coding-systemi wybierz utf-8plik, przeczytaj poprawnie. Jak słusznie odgadł Gilles, Emacs nie wykrywa kodowania pliku. Jeśli dodam kod ; -*- coding: utf-8 -*-do pliku, Emacs otworzy się i wyświetli poprawnie.


Aktualizacja 2

Ponownie zakodowałem plik w „UTF-8 z kodowaniem BOM”, a teraz wyświetla się dobrze w Emacsie. Nie wiem, jaka jest różnica między tymi dwoma typami, ale Emacs zdaje się być świadomy tylko BOMed.

NVaughan
źródło
Emacs nie rozpoznaje pliku jako UTF-8. Jaka jest zawartość twojego pliku init? Jaką wersję Emacsa używasz? Czy to coś zmieni, jeśli uruchomisz Emacsa za pomocą emacs -qlub emacs -Q?
Gilles „SO- przestań być zły”
Nie mam problemu z innymi plikami UTF-8. Używam GNU Emacs 24.4.4. Bez różnicy z emacs -qlub emacs -Q.
NVaughan,
Ach, jeśli to działa z innymi plikami i w nieskazitelnej konfiguracji, prawdopodobnie przyczyną jest to, że plik zawiera także gdzieś nieprawidłowy UTF-8. Pokażę, jak powiedzieć Emacsowi ...
Gilles „SO- przestań być zły”
prawdopodobnie powiązane: emacs.stackexchange.com/q/4100/2264
Sean Allred

Odpowiedzi:

10

Z jakiegoś powodu Emacs nie rozpoznaje pliku jako UTF-8. Możesz zmusić Emacsa do ponownego otwarcia pliku jako UTF-8, uruchamiając komendę C-x RET r( revert-buffer-with-coding-system) i wprowadzając utf-8.

Powodem, dla którego Emacs nie rozpoznał tego pliku jako UTF-8 (ale rozpoznaje inne), jest prawdopodobne, że zawiera on nieprawidłową sekwencję UTF-8. Ta sekwencja nadal będzie wyświetlana jako ukośnik odwrotny, po której następują trzy cyfry ósemkowe o innym kolorze ( escape-glyphtwarz) po ponownej interpretacji pliku jako UTF-8. Możesz wyszukać taką sekwencję, uruchamiając C-M-s( isearch-regexp) i szukając

[^^@-~[:multibyte:]]

gdzie ^@jest wprowadzane przez wpisanie C-q C-SPC(jest to znak ^ @ = 0, a nie dwuznakowa sekwencja circumflex-at; znak przed nim jest znakiem otaczającym).

Można wymusić Emacs rozpoznać plik jako UTF-8 przez dodanie kodowania zmiennej pliku systemowego : umieścić coś takiego -*-coding: utf-8-*-na pierwszej linii, lub umieścić coś takiego pod koniec pliku (można zastąpić #dowolnym prefiksem, ale Local Variables:i End:koniecznością wyglądają dokładnie tak jak w przypadku dwukropka końcowego):

# Local Variables:
# coding: utf-8
# End:

Emacs wybiera kodowanie, zgodnie z którym pliki są interpretowane na podstawie kilku ustawień, głównie środowisk językowych oraz zmiennych auto-coding-alisti auto-coding-regexp-alist. Ponieważ masz ten sam problem z tym plikiem, nawet gdy jest uruchomiony emacs -Q, myślę, że nie jest to problem z tymi ustawieniami, ale z zawartością pliku.

Gilles „SO- przestań być zły”
źródło
Jeśli otworzyć plik bez zmiennej plików systemu kodowania (czyli gdy plik wyświetla błędnie) i uruchomić regex wyszukiwania, cała moja \342, \200, \230itp uzyskać wybrany. Ale jeśli otworzę go „poprawnie” (przy użyciu zmiennej kodującej), wówczas nie pojawią się żadne wyniki wyszukiwania.
NVaughan,
@NVaughan Hmmm. Zatem nie rozumiem, dlaczego ten plik nie jest rozpoznawany jako UTF-8, gdy inni są (szczególnie poniżej emacs -Q).
Gilles „SO- przestań być zły”
1

Późno jest odpowiedzieć na pytanie dotyczące BOM, ale i tak to zrobię.

Znak kolejności bajtów (BOM) to ciąg trzech bajtów \ xef \ xbb \ xbf, który na początku pliku wskazuje systemom i aplikacjom, że zawartość jest zakodowana jako UTF-8. Właściwie są to metadane, które nie są traktowane jako część treści.

Większość aplikacji - Emacs jest jedną z nich - honoruje BOM i zapisuje za nim wszystkie pliki UTF-8. Inne aplikacje mogą to docenić podczas czytania, ale nie napisać; a inni nie wiedzą o tym i mogą rzucić komunikat o błędzie, gdy go napotkają. Innymi słowy, sytuacja jest chaotyczna. Wolę go używać wszędzie tam, gdzie to możliwe.

Celowo odpowiedział
źródło
-1

Tylko dla systemów typu UNIX.

W wielu przypadkach bezpośrednia definicja kodowania w ~ / .bashrc ~ / bash_profile

LANG=en_EN.UTF8

osiągnięty z

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

w ~ / .profile powinien rozwiązać problem.

PS Po tych poprawkach musisz ponownie RELOGINOWAĆ w swojej sesji, aby zmiany stały się widoczne.

Alioth
źródło
Chociaż to, co mówisz, może być przydatne, nie wydaje się, aby odpowiadało na to pytanie, ponieważ problem dotyczył tylko niektórych plików utf-8.
JeanPierre
Załóżmy, że po ścisłym zdefiniowaniu kodowania w plikach konfiguracyjnych problem ten może zniknąć dla wszystkich plików na zawsze do końca :-)
Alioth