Czy mój kod źródłowy powinien znajdować się w UTF-8?


10

Wydaje mi się, że często tak naprawdę nie wybierasz formatu, w jakim znajduje się kod. Mam na myśli, że większość moich narzędzi w przeszłości zdecydowała się na mnie. Albo nawet tak naprawdę o tym nie myślałem. Kiedyś korzystałem z TextPada na Windowsie, a kiedy zapisywałem plik, pojawił się monit o ASCII, UTF-8/16, Unicode itp. Itd.

Zakładam, że prawie cały napisany kod to ASCII, ale dlaczego miałby to być ASCII? Czy powinniśmy teraz używać plików UTF-8 do kodu źródłowego i dlaczego? Wyobrażam sobie, że może to być przydatne w zespołach wielojęzycznych. Czy istnieją standardy związane z tym, jak wielojęzyczne zespoły nazywają zmienne / funkcje / itp?


6
Piszę cały mój kod w Klingon, ty niewrażliwy grudo!

5
@JackManey: To nie jest /. ty niewrażliwy grudo!
FrustratedWithFormsDesigner

A skrypt Klingon nie jest w standardzie Unicode, więc musisz użyć znaków „do użytku prywatnego” lub transliteracji ASCII.
dan04

@ dan04: Klingon ma pseudo-standardowe zastosowanie części BMP do użytku prywatnego (patrz rejestr ConScript ) :-)
Ross Patterson

Zobacz także argumenty tutaj: utf8everywhere.org
Rory Hunter

Odpowiedzi:


23

Wybór nie jest pomiędzy ASCII i UTF-8. ASCII to 7-bitowe kodowanie, a UTF-8 zastępuje je - każdy poprawny tekst ASCII jest również prawidłowy UTF-8. Problemy pojawiają się, gdy używasz znaków spoza ASCII; dla tych musisz wybrać pomiędzy UTF-8, UTF-16, UTF-32 i różnymi kodowaniami 8-bitowymi (ISO-xxxx itp.).

Najlepszym rozwiązaniem jest trzymanie się ścisłego zestawu znaków ASCII, to znaczy po prostu nie używaj w kodzie żadnych znaków spoza ASCII. Większość języków programowania zapewnia sposoby wyrażania znaków spoza ASCII za pomocą znaków ASCII, np. "\u1234"Do wskazywania punktu kodu Unicode na 1234. W szczególności unikaj używania znaków innych niż ASCII do identyfikacji. Nawet jeśli działają poprawnie, osoby korzystające z innego układu klawiatury przeklinają cię za zmuszanie ich do wpisywania tych znaków.

Jeśli nie możesz uniknąć znaków spoza ASCII, UTF-8 jest najlepszym wyborem. W przeciwieństwie do UTF-16 i UTF-32 jest to nadzbiór ASCII, co oznacza, że ​​każdy, kto otworzy go z niewłaściwym kodowaniem, dostanie co najmniej większość z nich poprawnie; i w przeciwieństwie do 8-bitowych stron kodowych, może zakodować jednoznacznie każdy znak, którego kiedykolwiek potrzebujesz, i jest dostępny w każdym systemie, niezależnie od ustawień regionalnych.

A potem masz kodowanie, które przetwarza Twój kod; nie musi to być to samo, co kodowanie pliku źródłowego. Na przykład, mogę łatwo pisać PHP w UTF-8, ale ustawiam wewnętrzne kodowanie wielobajtowe na, powiedzmy, Latin-1; ponieważ parser PHP w ogóle nie zajmuje się kodowaniem, a jedynie odczytuje sekwencje bajtów, moje literały łańcuchowe UTF-8 będą błędnie interpretowane jako Latin-1. Jeśli wyprowadzę te łańcuchy na terminal UTF-8, nie zobaczysz żadnych różnic, ale długości łańcuchów i inne operacje wielobajtowe (np. substr) Spowodują nieprawidłowe wyniki.

Moją ogólną zasadą jest używanie UTF-8 do wszystkiego; tylko jeśli absolutnie masz do czynienia z innymi kodowaniami, przekonwertuj na UTF-8 tak wcześnie, jak to możliwe, a z UTF-8 tak późno, jak to możliwe.


6

Większość IDE domyślnie zapisuje przy użyciu kodowania UTF-8, i prawie na pewno powinieneś wybrać UTF-8 zamiast ASCII, jeśli masz taką opcję. Dzięki temu nie napotkasz dziwnych problemów z kodem internacjonalizacji.


2
Sprawiasz, że ASCII vs. UTF-8 jest wyborem. Gdy w pliku znajdują się znaki spoza ASCII, tak nie jest. Gdy są tylko znaki ASCII, UTF-8 to ASCII.
Fred Foo,

Chciałbym, żeby Eclipse się do tego zastosował. Jako student pierwszego roku CS, mój bóg był przyczyną wielu bólów głowy podczas pracy w grupach, w których obecni są użytkownicy systemów OS X, Windows i Linux. (W celach informacyjnych domyślnie jest to MacRoman w systemie OS X, CP-1252 w systemie Windows i zapomniałem, który z nich jest w systemie Linux, ale założę się, że jest inny).
leflings

@leflings - prawdopodobnie domyślne kodowanie środowiska, którym obecnie jest zwykle UTF-8.
Maciej Piechotka

1

Możliwość wpisania zwykłego tekstu do cytowanych ciągów lub znaków w kodzie źródłowym oraz możliwość zobaczenia rzeczywistego znaku jest bardzo miła. Na przykład symbol pi „π” lub ideograf „𠀊” są znacznie ładniejsze niż odpowiednik „\ u3c0” dla pi i L '\ u2000A dla ideografu.

Możliwe jest wpisywanie i / lub kopiowanie i wklejanie tych znaków bezpośrednio do kodu źródłowego, podobnie jak znaki ASCII, w przyzwoitym edytorze.

Uważam, że konkretne przykłady są pomocne w konceptualizacji i zrozumieniu rzeczy, których opisy czasami nie wydają się prowadzić do domu. Konceptualizuj stałe znaków Unicode wpisane w kodzie źródłowym, takie jak następujący krótki przykładowy fragment kodu:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

Znak tyldy ASCII „~” można zapisać w pliku źródłowym ASCII lub UTF-8, ale znaków Unicode nie można zapisać w formacie ASCII. Symbol PI „π” jest kodem Unicode punkt 0x3c0 i może być przechowywany w formie UTF-8 jako dwubajtowa wartość 0xcf, 0x80. Ideografy w punktach kodu Unicode 0x2000a i 0x2893d wymagają 4 bajtowych sekwencji UTF-8.

Aby znaki te zachowały zamierzone wartości, a kompilator zinterpretował je zgodnie z przeznaczeniem, kod źródłowy należy zapisać w formacie obsługującym zestaw znaków Unicode, takim jak UTF-8 lub UTF-16. Jeśli zostanie zapisany jako UTF-8, porządny kompilator zrozumie i zinterpretuje wartości zgodnie z przeznaczeniem, a porządny edytor załaduje i wyświetli znaki poprawnie.

Jak zauważyli inni, jeśli po prostu nie masz żadnych znaków w kodzie źródłowym, które są poza zakresem ASCII, zapisanie jako UTF-8 spowoduje utworzenie pliku, który nie różni się od zapisania pliku ASCII, ponieważ UTF- 8 został zaprojektowany tak, aby nakładał się na ASCII w zakresie znaków ASCII. Jak tylko wpiszesz dowolny kod w kodzie źródłowym, który jest poza zakresem ASCII, porządny edytor poinformuje cię, że musisz wybrać kodowanie, aby użyć do zapisania pliku. UTF-8 jest dobrym wyborem, ponieważ może obsługiwać ASCII w stanie, w jakim jest i praktycznie każda inna postać obsługiwana w środowisku programistycznym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.