Cp1254 ve utf8 decode() encode()

import locale
locale.getpreferredencoding()

‘cp1254’

“ş”.encode(“utf8”)

b’\xc5\x9f’

b’\xc5\x9f’.decode(“cp1254”)

‘ÅŸ’

Python bana cp1254 ile kodlama yaptığımı söylüyor ama karakteri doğru bir şekilde çevirmiyor.

Şöyle yapmalısınız.

>>> "ş".encode("utf-8")
b'\xc5\x9f'
>>> b"\xc5\x9f".decode("utf-8")
ş

Eğer stringi cp1254 ile encode ediyorsanız, onu geri eski haline çevirmek için aynı karakter kodlamasıyla decode etmelisiniz.

>>> "ş".encode("cp1254")
b'\xfe'
>>> b'\xfe'.decode("cp1254")
ş

Python, bulundugun locale’in tercih edilen kodlama biciminin Windows-1254 oldugunu soyluyor.

Dogru bir sekilde cevirmekten kastin nedir? Yapmaya calistigin sey nedir?

Burada ş codepoint’ini UTF-8 olarak encode ettirmissin ve geriye ş'in UTF-8 encoding’i olan C5 9F byte’larini almissin.
Sonra ÅŸ'nin Windows-1254 kodlamasi olan C5 9F'i alip Windows-1254 olarak decode edilmesini soylemissin ve geriye ÅŸ almissin.
Burada bir yanlislik goremiyorum.

Anladım.Teşekkür ederim

Bu konuda bayağı bi kafam karışmış heralde.Ama sonradan anladım.Teşekkür ederim

Datayi iki sey belirliyor: Degeri ve turu. Degeri hafizada kullandigi bitler, sayilar olarak dusunebilirsin. Turu ise bu sayilarin ne sekilde yorumlanacagi ve uzerinde ne sekilde islem yapilacagi. Aslinda tur, degerden daha onemli ve daha cok bilgi tasiyor.

Ornegin 0x7F veya 127 degeri (7 tane 1 degerli bit; 0b1111111) turune gore “127 puan”, “gri rengi”, “penguen resmi” veya “bolumdeki 7 canavarin hepsi yasiyor” anlamlarina gelebilir.

0xC5 0x9F'in hem ş hem de ÅŸ anlamina gelmesi de boyle. 50591 (0xc59f) veya 40901 (0x9fc5) sayilari manasina da gelebiliyor.