2010-08-07 31 views
5

Bir bayt akışını MultiByteToWideChar() WinAPI işleviyle dönüştürmeye çalışıyorum.Bayt akışını başka bir kodlamaya nasıl dönüştürürüm?

Belgeler, eksik dizelerdeki ERROR_NO_UNICODE_TRANSLATION ile işlev başarısız olduğunu söylüyor (çok baytlı kodlanmış dizede takip eden bir bayt yok). Bu hatayı nasıl önleyebilirim? Akla gelen tek yol, giriş arabelleğinin son çok baytlı karakterini dönüştürmek değildir (onu bulmak için IsDBCSLeadByteEx()'u kullanarak).

Bayt akışını dönüştürmek için daha iyi çözümler var mı?

+0

Hangi kod sayfalarını kullanırsınız? Hangi formda verileri alırsınız? Umarım başından sonuna kadar ve tam tersi değil. – Oleg

+0

Kod, Windows platformları tarafından desteklenen tüm kod sayfalarıyla çalışmalıdır. Verileri çok baytlı veya tek baytlı kodlamada alıyorum ve bunu dahili olarak geniş formda işlemek ve çıktıda yerel olarak spesifik kodlamaya (işlemden sonra) dönüştürmek istiyorum. – Basilevs

cevap

2

Görünüşe göre, CharNextExA giriş akışındaki sonraki karakter konumuna geçmek için kullanabilirsiniz. Bu şekilde bazı karakterler alabilir ve UNICODE dizesinde MultiByteToWideChar ile birlikte dönüştürebilirsiniz. UNICODE metin parçasını aldıktan sonra, WideCharToMultiByte'u kullanarak başka bir kod sayfasına dönüştürebilirsiniz.

GÜNCEL: I girdi veri akımının alınması işlemi CharNextExA, MultiByteToWideChar ve WideCharToMultiByte ilgili olan verilerin kod çözme gibi çok daha yavaş olduğundan emin. Örneğin, yığında WCHAR szBuffer[4096] ve TCHAR szDestBuffer[4096] gibi bir arabellek kullanırsanız, 1K girdi verilerini çok hızlı bir şekilde çözebilirsiniz. Bu yüzden, 'un tüm programınızın toplam çalışma süresi, bu üç fonksiyonun kullanımından neredeyse çıkacaktır.

Ayrıca, başka bir seçeneğiniz olduğundan emin değilim. Metnin kodunu çözmenin metnin başından başlayarak güvenilir bir yol bilmiyorum. Muhtemelen diğer insanlar başka bir fikre sahip ...

+0

Daha verimli bir yaklaşıma ihtiyacım var - veri parçaları çok büyük ve her sembol için işlev aramak istemiyorum. Bir dizi çağrıyı azaltmanın bir yolu var mı? – Basilevs

+1

Windows platformları tarafından desteklenen tüm kod sayfalarını desteklemek istiyorsanız, başka bir yolun imkansız olduğunu düşünüyorum. 'IsDBCSLeadByteEx' belgelerinde aşağıdakileri okuyabilirsiniz: "Kurşun bayt değerleri, her bir DBCS'ye özgüdür. Bazı bayt değerleri, bir DBCS karakterinin hem başlangıç ​​hem de iz baytı olarak tek bir kod sayfasında görünebilir. Bu nedenle, IsDBCSLeadByteEx yalnızca belirtilebilir. potansiyel bir potansiyel bayt değeri. Dolayısıyla, CharNextExA ile verilerin sıralı taraması tek güvenli yol gibi görünüyor. Sadece herhangi bir performans değişimini "CharNextExA" kullanımından dolduracağınızı doğrulayın. Bu hızlı. CharPrevExA yavaş – Oleg

+1

CharPrevExA() ile 10000 bayt arabellek sonunda 10 baytlık bir kuyruk analiz tüm arabelleği CharNextExA() ile işlemek daha yavaş mı? CharPrevExA, lpCurrentChar argümanı olarak bir karakter ortağının düzgün bir şekilde verilmesini sağlıyor mu? – Basilevs

İlgili konular