fsdotnet

Case Converter

Dönüştürücüler

yerelde çalışır

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.