Haruskah kode sumber saya berada di UTF-8?

10

Saya merasa bahwa Anda sering tidak benar-benar memilih format apa kode Anda. Maksudku sebagian besar alat saya di masa lalu telah memutuskan untuk saya. Atau saya bahkan belum memikirkannya. Saya menggunakan TextPad di windows tempo hari dan ketika saya sedang menyimpan file, itu mendorong saya tentang ASCII, UTF-8/16, Unicode dll dll ...

Saya berasumsi bahwa hampir semua kode yang ditulis adalah ASCII, tetapi mengapa harus ASCII? Haruskah kita benar-benar menggunakan file UTF-8 sekarang untuk kode sumber, dan mengapa? Saya membayangkan ini mungkin berguna pada tim multi-bahasa. Apakah ada standar yang terkait dengan bagaimana tim multibahasa menyebut variabel / fungsi / dll?

Parris
sumber
6
Saya menulis semua kode saya di Klingon, Anda gumpal tidak sensitif!
5
@JackManey: Ini bukan /. Anda gumpal tidak sensitif!
FrustratedWithFormsDesigner
Dan skrip Klingon tidak dalam Unicode, jadi Anda harus menggunakan karakter "penggunaan pribadi" atau transliterasi ASCII.
dan04
@ dan04: Klingon memiliki penggunaan semu-standar dari bagian penggunaan pribadi dari BMP (lihat registri ConScript ) :-)
Ross Patterson
Lihat juga argumen di sini: utf8everywhere.org
Rory Hunter

Jawaban:

23

Pilihannya bukan antara ASCII dan UTF-8. ASCII adalah pengodean 7-bit, dan UTF-8 menggantikannya - teks ASCII yang valid juga valid UTF-8. Masalah muncul ketika Anda menggunakan karakter non-ASCII; untuk ini Anda harus memilih antara UTF-8, UTF-16, UTF-32, dan berbagai pengkodean 8-bit (ISO-xxxx, dll.).

Solusi terbaik adalah tetap menggunakan charset ASCII yang ketat, yaitu, jangan gunakan karakter non-ASCII dalam kode Anda. Sebagian besar bahasa pemrograman menyediakan cara untuk mengekspresikan karakter non-ASCII menggunakan karakter ASCII, misalnya "\u1234"untuk menunjukkan titik kode Unicode pada 1234. Terutama, hindari menggunakan karakter non-ASCII untuk pengidentifikasi. Bahkan jika mereka bekerja dengan benar, orang-orang yang menggunakan tata letak keyboard yang berbeda akan mengutuk Anda karena membuat mereka mengetik karakter ini.

Jika Anda tidak dapat menghindari karakter non-ASCII, UTF-8 adalah taruhan terbaik Anda. Tidak seperti UTF-16 dan UTF-32, ini adalah superset dari ASCII, yang berarti siapa pun yang membukanya dengan pengkodean yang salah mendapatkan paling tidak sebagian besar benar; dan tidak seperti codepage 8-bit, ia dapat menyandikan setiap karakter yang Anda perlukan, secara jelas, dan tersedia di setiap sistem, terlepas dari lokal.

Dan kemudian Anda memiliki encoding yang diproses oleh kode Anda; ini tidak harus sama dengan penyandian file sumber Anda. Sebagai contoh, saya dapat dengan mudah menulis PHP di UTF-8, tetapi mengatur multibyte-encoding internal untuk, katakanlah, Latin-1; karena parser PHP tidak mementingkan penyandian sama sekali, tetapi hanya membaca urutan byte, literal string UTF-8 saya akan disalahartikan sebagai Latin-1. Jika saya output string ini pada terminal UTF-8, Anda tidak akan melihat perbedaan, tetapi panjang string dan operasi multibyte lainnya (misalnya substr) akan menghasilkan hasil yang salah.

Aturan praktis saya adalah menggunakan UTF-8 untuk semuanya; hanya jika Anda benar-benar harus berurusan dengan penyandian lain, konversi ke UTF-8 sedini mungkin dan dari UTF-8 selambat mungkin.

tammmer
sumber
6

Sebagian besar IDE akan default untuk menyimpan dengan pengkodean UTF-8, dan Anda hampir pasti harus memilih UTF-8 daripada ASCII ketika diberi pilihan. Ini akan memastikan Anda tidak mengalami masalah aneh dengan kode internasionalisasi.

Oleksi
sumber
2
Anda membuatnya seolah-olah ASCII vs UTF-8 adalah pilihan. Ketika ada karakter non-ASCII dalam file, itu bukan. Ketika hanya ada karakter ASCII, UTF-8 adalah ASCII.
Fred Foo
Saya berharap Eclipse akan mematuhi ini. Sebagai siswa tahun pertama CS-ish, Tuhan saya telah menyebabkan banyak sakit kepala ketika bekerja dalam kelompok, di mana ada kehadiran pengguna OS X, Windows dan Linux. (Untuk referensi itu default ke MacRoman pada OS X, CP-1252 pada Windows dan saya lupa yang mana di linux, tetapi Anda bertaruh Anda itu yang berbeda.)
leflings
@leflings - mungkin penyandian lingkungan default yang saat ini biasanya UTF-8.
Maciej Piechotka
1

Mampu mengetik teks biasa menjadi string atau karakter yang dikutip dalam kode sumber dan bisa melihat karakter sebenarnya sangat bagus. Misalnya simbol pi 'π' atau ideograf '𠀊' jauh lebih bagus daripada padanan '\ u3c0' untuk pi dan L '\ u2000A' untuk ideograf.

Dimungkinkan untuk mengetik dan / atau menyalin dan menempelkan karakter-karakter ini secara langsung ke dalam kode sumber, seperti halnya Anda akan karakter ASCII, dalam editor yang layak.

Saya menemukan contoh-contoh konkret membantu dalam mengkonseptualisasikan dan memahami hal-hal yang kadang-kadang tidak dijelaskan oleh deskripsi kata. Mengkonseptualisasikan konstanta karakter Unicode yang diketik ke dalam kode sumber, seperti cuplikan kode contoh singkat berikut:

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)  '𨤽';

Karakter ASCII tilde '~' dapat disimpan dalam file sumber ASCII atau UTF-8, tetapi karakter Unicode tidak dapat disimpan dalam bentuk ASCII. Simbol PI 'π' adalah titik kode Unicode 0x3c0 dan dapat disimpan dalam bentuk UTF-8 sebagai nilai dua byte 0xcf, 0x80. Ideograf pada kode Unicode menunjukkan 0x2000a dan 0x2893d memerlukan 4 byte urutan UTF-8.

Agar karakter tersebut dapat mempertahankan nilai yang diinginkan dan kompiler untuk menafsirkannya sebagaimana dimaksud, kode sumber perlu disimpan dalam format yang mendukung rangkaian karakter Unicode, seperti UTF-8 atau UTF-16. Jika disimpan sebagai UTF-8, kompiler yang layak akan memahami dan menafsirkan nilai-nilai sebagaimana dimaksud dan editor yang baik akan memuat dan menampilkan karakter dengan benar.

Seperti yang telah ditunjukkan oleh orang lain, jika Anda tidak memiliki karakter dalam kode sumber Anda yang berada di luar rentang ASCII, menyimpan sebagai UTF-8 akan menghasilkan file yang tidak berbeda dengan menyimpan file ASCII, karena UTF- 8 dirancang untuk tumpang tindih ASCII dalam berbagai karakter ASCII. Segera setelah Anda mengetik karakter apa pun ke dalam kode sumber Anda yang berada di luar rentang ASCII, editor yang baik akan memberi tahu Anda bahwa Anda harus memilih penyandian untuk digunakan untuk menyimpan file. UTF-8 adalah pilihan yang baik karena dapat menangani ASCII sebagaimana adanya dan hampir setiap karakter lain yang didukung dalam lingkungan pengembangan Anda.

Dan Hagler
sumber