2011-02-08 42 views
8

Bazı eski (2003) Delphi kodlarını Delphi Architect XE'ye yükseltirim ve birkaç sorunla karşılaşıyorum. Uyumsuz türlerin olduğu birtakım hatalar alıyorum. Bu hatalar Delphi 6'da gerçekleşmez, dolayısıyla bunun bir şeyleri güncellendiği için var olduğunu farz etmeliyim.WideChar ve AnsiChar arasındaki fark nedir?

PAnsiChar ve PWideChar arasındaki farkın ne olduğunu bilmiyorum, fakat Delphi kesinlikle farkı bilir ve derlememe izin vermez. Farklılıkların ne olduğunu bilseydim, belki de hangisinin kullanılacağını veya nasıl düzeltileceğini anlayabiliyordum.

+0

Kendi sorumu yanıtlamış olabilirim. AnsiChar sadece [0 ... 255] iken WideChar tutar [0 ... 65,535]. WideChar unicode ya da bir şey olduğunu varsayalım. – Daisetsu

+0

D2009'daki Unicode yükseltmesi sessiz büyük bir geliştirmendi ... Kodunuzu dikkatli bir şekilde gözden geçirmeniz ve dizgi türlerini kontrol etmeniz gerekir. Eğer genel veri türünü 'String' ve' Char' kullanırsanız, her şey doğru string tipine doğru bir şekilde haritalanmalıdır ... –

cevap

18

Kısa: Delphi 2009'dan önce Delphi'de yerel dize türü ANSI CHAR'dı: Her dizgede her char 8 bitlik bir char olarak temsil edildi. Delphi 2009 ile başlayan Delphi dizeleri, UTF-16 gösterimini kullanarak UNICODE oldu: Şimdi temel Char, 16 bit veri (2 bayt) kullanır ve muhtemelen iki olarak gösterilen Unicode kod noktaları hakkında çok fazla bilgi sahibi olmanıza gerek yoktur. ardışık 16 bit chars.

8 bitlik karakterlere "Ansi Chars" denir. Bir PAnsiChar 8 bit chars için bir işaretçidir. 16 bit karaktere "Wide Chars" denir. Bir PWideChar 16 bit karaktere işaretçidir. Delphi farkı bilir ve ikisini karıştırmanıza izin vermezse iyi yapar!

diğer bilgiler

İşte Unicode popüler bir bağlantı var: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

Burada Unicode'a Delphi geçilmesiyle ilgili biraz daha bilgi bulabilirsiniz: New White Paper: Delphi Unicode Migration for Mere Mortals

Ayrıca Delphi" için SO arayabilir Unicode geçişi ".

9

Birkaç yıl önce, Delphi varsayılan karakter tipi WideChar-AnsiChar (ANSI karakteri temsil eden tek bayt değişkeni) değiştirildi (değişken iki baytlık bir UTF16 karakteri temsil eder.) char türü artık bir diğer adıdır yerine AnsiChar ait WideChar, string türü artık UnicodeString (Delphi geleneksel dize türünde bir UTF-16 Unicode sürümü) yerine AnsiString bir diğer adıdır ve PChar türü artık PWideChar yerine PAnsiChar bir diğer adıdır.

derleyici dönüşüm kendisi bir sürü bakabilirim, ama bazı sorunlar vardır

:

  1. böyle PChar olarak, emin olmak gerekir, dize işaretçisi türlerini kullanıyorsanız sizin işaretçi doğru veri tipini işaret ediyor ve derleyici bunu her zaman doğrulayamıyor.
  2. Dizeleri var parametrelerine iletiyorsanız, değişken türünün tam olarak aynı olması gerekir. Bununla başa çıkmak için iki dizi türünüzün olması artık daha karmaşık olabilir.
  3. UnicodeString olarak çalışmayan bir değişken yerine metni tutmak için uygun bir bayt dizisi arabellek olarak kullanıyorsanız, uygun bir bayt dizisi arabelleği. Bunun bir geçici çözüm olarak RawByteString olarak bildirildiğinden emin olun.
  4. Örn. Bayt uzunluklarıyla uğraştığınız bir anyplace, örneğin bir TStream'e okuma/yazma yaparken, kodunuzun char'un bir bayt uzunluğunda olduğunu varsaymadığından emin olun.

Bazı daha hileler ve bunun nasıl işe alınacağına dair öneri için Delphi Unicode Migration for Mere Mortals'a bir göz atın. Göründüğü kadar zor değil, ama ya önemsiz değil. İyi şanslar!

İlgili konular