Türkçe kasa dönüşümü ve "file".ToUpper() neden FİLE döndürür
Türkçede iki tane i harfi var. Noktasız ı büyük harfte I olur, noktalı i ise İ. Dolayısıyla tr-TR kültürüne duyarlı bir büyük harf dönüşümü "file" kelimesini "FİLE", geri dönerken de "KITAP_ID" kelimesini "kitap_ıd" yapar. Bu Türkçe düz metin için doğru, geri kalan her şey için yanlıştır.
Bir tanımlayıcı bu dönüşümden geçtiği anda hataya dönüşüyor: kolon adı, dosya uzantısı, HTTP başlığı, kültür kodu. .NET'te ToUpper() ve ToLower() varsayılan olarak geçerli kültürü kullanır, yani aynı kod çalıştığı makineye göre farklı sonuç üretir — hatanın genellikle geliştirici bilgisayarında değil üretimde ortaya çıkmasının sebebi de bu.
Bu dönüştürücü iki sonucu yan yana gösteriyor. Tanımlayıcı olan her şey invariant kasa ister; yalnızca insana gösterilen metin Türkçe kurallarını ister.
C#'ta hangisini kullanmalıyım?
- Tanımlayıcılar için ToUpperInvariant() ve ToLowerInvariant(), karşılaştırmalar için string.Equals(a, b, StringComparison.OrdinalIgnoreCase). Kültüre duyarlı aşırı yüklemelere yalnızca sonuç bir insana gösteriliyorsa uzanın.
JavaScript'te de aynı sorun var mı?
- Varsayılan olarak yok: toUpperCase() yerel ayardan bağımsızdır, hiçbir zaman İ üretmez. Yalnızca toLocaleUpperCase('tr') üretir — yani hata tarayıcıda isteğe bağlı, .NET'te ise varsayılan.