Kaynak kodum UTF-8'de olmalı mı?


10

Sıklıkla kodunuzun hangi formatta olduğunu gerçekten seçmediğinizi hissediyorum. Demek istediğim, geçmişte kullandığım araçların çoğu benim için karar verdi. Ya da gerçekten düşünmedim bile. Geçen gün Windows'da TextPad kullanıyordum ve bir dosyayı kaydederken ASCII, UTF-8/16, Unicode vb.

Yazılan hemen hemen tüm kodların ASCII olduğunu varsayıyorum, ama neden ASCII olmalı? Kaynak kodu için şimdi UTF-8 dosyalarını kullanmalı mıyız ve neden? Bunun çok dilli ekiplerde yararlı olabileceğini hayal ediyorum. Çok dilli ekiplerin değişkenleri / işlevleri / vb. Adlandırmalarıyla ilişkili standartlar var mı?


6
Kodumu Klingon'a yazıyorum, duyarsız kesek!

5
@JackManey: Bu / değil. duyarsız kesek!
SinirliWithFormsDesigner

Ve Klingon betiği Unicode'da olmadığından, "özel kullanım" karakterlerini veya bir ASCII harf çevirisi kullanmanız gerekir.
dan04

@ dan04: Klingon, BMP'nin özel kullanım bölümünün sahte standart kullanımına sahiptir ( ConScript kayıt defterine bakın ) :-)
Ross Patterson

Ayrıca buradaki argümanlara da bakınız: utf8everywhere.org
Rory Hunter

Yanıtlar:


23

Seçim ASCII ve UTF-8 arasında değil. ASCII 7 bit kodlamadır ve UTF-8 bunun yerini alır - geçerli herhangi bir ASCII metni de geçerli UTF-8'dir. ASCII olmayan karakterler kullandığınızda sorunlar ortaya çıkar; bunlar için UTF-8, UTF-16, UTF-32 ve çeşitli 8 bit kodlamalar (ISO-xxxx vb.) arasından seçim yapmanız gerekir.

En iyi çözüm, sıkı bir ASCII karakter kümesine bağlı kalmaktır, yani kodunuzda ASCII olmayan karakterler kullanmayın. Çoğu programlama dili ASCII olmayan karakterleri ASCII karakterlerini kullanarak, örneğin "\u1234"1234'te Unicode kod noktasını belirtmek için ifade etmenin yollarını sağlar. Özellikle, tanımlayıcılar için ASCII olmayan karakterler kullanmaktan kaçının. Düzgün çalışsalar bile, farklı bir klavye düzeni kullanan kişiler bu karakterleri yazmaları için sizi lanetleyecektir.

ASCII dışı karakterlerden kaçınamıyorsanız, UTF-8 en iyi seçenektir. UTF-16 ve UTF-32'den farklı olarak, ASCII'nin bir üst kümesidir, yani yanlış kodlama ile açan herkes en azından çoğunu doğru alır; ve 8 bit kod sayfalarının aksine, ihtiyacınız olan her karakteri net bir şekilde kodlayabilir ve yerel ayardan bağımsız olarak her sistemde kullanılabilir.

Ve sonra kodunuzun işlediği kodlamaya sahipsiniz; bunun kaynak dosyanızın kodlamasıyla aynı olması gerekmez. Örneğin, UTF-8'de kolayca PHP yazabilirim, ancak dahili çoklu bayt kodlamasını örneğin Latin-1; PHP ayrıştırıcısı kodlamalarla hiç ilgili olmadığından, sadece bayt dizilerini okuduğundan UTF-8 dizgi değişmezlerim Latin-1 olarak yanlış yorumlanacaktır. Bu dizeleri bir UTF-8 terminalinde çıkarırsam, hiçbir fark görmezsiniz, ancak dize uzunlukları ve diğer çok baytlı işlemler (örn. substr) Yanlış sonuçlar verir.

Temel kuralım her şey için UTF-8 kullanmak; yalnızca diğer kodlamalarla kesinlikle uğraşmanız gerekiyorsa, mümkün olduğunca erken UTF-8'e ve mümkün olduğunca geç UTF-8'e dönüştürün.


6

Çoğu IDE, varsayılan olarak UTF-8 kodlamasıyla kaydetmeyi seçer ve seçenek verildiğinde ASCII yerine neredeyse kesinlikle UTF-8'i seçmelisiniz. Bu, uluslararasılaşma koduyla garip problemlerle karşılaşmamanızı sağlayacaktır.


2
ASCII'ye karşı UTF-8'in bir seçim olduğunu düşünüyorsunuz. Bir dosyada ASCII olmayan karakterler olduğunda değil. Yalnızca ASCII karakterleri olduğunda, UTF-8 olduğunu ASCII.
Fred Foo

Keşke Eclipse buna uysaydı. İlk yıl CS-ish öğrencisi olarak, tanrım bu, OS X, Windows ve Linux kullanıcılarının bulunduğu gruplarda çalışırken birçok baş ağrısının nedeni olmuştur. (Referans için varsayılan olarak OS X'te MacRoman, Windows'ta CP-1252 ve
linux'da

@leflings - muhtemelen şu anda genellikle UTF-8 olan varsayılan bir ortam kodlaması.
Maciej Piechotka

1

Kaynak koddaki alıntı dizelere veya karakterlere düz metin yazabilmek ve gerçek karakteri görebilmek çok güzel. Örneğin, pi sembolü 'π' veya '𠀊' ideografı, pi için '\ u3c0' ve ideografi için L '\ u2000A' eşdeğerinden çok daha hoştur.

Bu karakterleri tıpkı ASCII karakterlerinde olduğu gibi doğrudan bir kaynak koduna yazmak ve / veya kopyalayıp yapıştırmak iyi bir düzenleyicide mümkündür.

Kelime açıklamalarının bazen eve gitmediği şeyleri kavramsallaştırma ve anlamada somut örnekler buluyorum. Aşağıdaki kısa örnek kod snippet'i gibi kaynak koduna yazılan Unicode karakter sabitlerini kavramsallaştırın:

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

ASCII tilde karakteri '~' ASCII veya UTF-8 kaynak dosyasına kaydedilebilir, ancak Unicode karakterleri ASCII biçiminde saklanamaz. 'Π' PI sembolü Unicode kod noktası 0x3c0'dır ve UTF-8 biçiminde iki bayt değeri 0xcf, 0x80 olarak saklanabilir. Unicode kod noktalarındaki İdeograflar, 0x2000a ve 0x2893d noktalarını 4 bayt UTF-8 dizileri gerektirir.

Bu karakterlerin amaçlanan değerlerini koruyabilmesi ve derleyicinin amaçlandığı şekilde yorumlayabilmesi için, kaynak kodun UTF-8 veya UTF-16 gibi Unicode karakter kümesini destekleyen bir biçimde kaydedilmesi gerekir. UTF-8 olarak kaydedildiyse, iyi bir derleyici amaçlandığı gibi değerleri anlayacak ve yorumlayacak ve iyi bir düzenleyici karakterleri düzgün bir şekilde yükleyecek ve görüntüleyecektir.

Diğerlerinin işaret ettiği gibi, kaynak kodunuzda ASCII aralığının dışında herhangi bir karakter yoksa, UTF-8 olarak kaydetmek, UTF- Şekil 8, ASCII karakter aralığındaki ASCII ile çakışacak şekilde tasarlanmıştır. Kaynak kodunuza ASCII aralığının dışındaki herhangi bir karakteri yazar yazmaz, iyi bir editör dosyayı kaydetmek için kullanmak üzere bir kodlama seçmeniz gerektiğini bildirecektir. UTF-8 iyi bir seçimdir çünkü ASCII'yi olduğu gibi ve geliştirme ortamınızda desteklenen hemen hemen her karakteri işleyebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.