RTL のバグによる文字コード関連の問題を回避するには?

 文字コード絡みの QC は結構ありまして。それを回避するにはテクニックではなく知識が必要となります。「QC 探せ」 というのは簡単な事なのですが、思ってもみない所に不具合があったりして、QC をあたっても気付かない事が多いです。



ANSI 版 Delphi では TComboboxのAutoComplete プロパティがデフォルトで True なのに、2 バイト文字を入力してバックスペースを押すと 1 バイトしか消えない (ANSI 版 Delphi で発生)

QC No:

Report No: 47608 Status: Closed
under XP/Luna interface, TComboBox can not handle DBCS character correctly.
http://qc.embarcadero.com/wc/qcmain.aspx?d=47608
QCWIN:Defect_No=47608

回避策:

注意:

 ANSI 版 Delphi の問題です。この問題は Delphi 2009 で解決されている事になっていますが、Unicode 化した事で "結果的に" 問題が解決しただけです。


ANSI 版 Delphi では UTF8Encode() / UTF8Decode() がサロゲートペアを正しく処理しない (ANSI 版 Delphi で発生)

QC No:

Report No: 58386 Status: Closed
UTF8Encode does not support 'Surrogates Pair'
http://qc.embarcadero.com/wc/qcmain.aspx?d=58386
QCWIN:Defect_No=58386

回避策:

注意:

 ANSI 版 Delphi の問題です。この問題は Delphi 2009 で解決されています。


TEncoding で UTF-32 が使えるようにして欲しい (Unicode 版 Delphi で発生)

QC No.

Report No: 62637 Status: Closed
Add UTF-32 property to TEncoding [Win32]
http://qc.embarcadero.com/wc/qcmain.aspx?d=62637
QCWIN:Defect_No=62637

Report No: 89066 Status: Closed
Add the following methods to TEncoding
http://qc.embarcadero.com/wc/qcmain.aspx?d=89066
QCWIN:Defect_No=89066

回避策

注意:

 TEncoding で UTF-32 が使えない事に対しての要望です。いずれも Cannot Fix で Close されています。


ANSI 版 Delphi では AnsiLeftStr() / AnsiMidStr() / AnsiReverseString() / AnsiRightStr() がラウンドトリップ問題を引き起こす (ANSI 版 Delphi で発生)

QC No.

Report No: 65155 Status: Closed
AnsiLeftStr/AnsiRightStr/AnsiMidStr does round-trip conversion.
http://qc.embarcadero.com/wc/qcmain.aspx?d=65155
QCWIN:Defect_No=65155

回避策

注意:

 この問題は Delphi 2009 Update 3 で解決されています。基本的に ANSI 版 Delphi の問題ですが、Update 3 の適用されていない Delphi 2009 では AnsiStrings.AnsiLeftStr() / AnsiStrings.AnsiMidStr() / AnsiStrings.AnsiReverseString() / AnsiStrings.AnsiRightStr() で同様なラウンドトリップ問題が発生します。


2 桁のコントロール文字列は RawByte であるべき (Unicode 版 Delphi で発生)

QC No:

Report No: 67468 Status: Open
Control-String of 2-digits should be RawByte.
http://qc.embarcadero.com/wc/qcmain.aspx?d=67468
QCWIN:Defect_No=67468

回避策:

注意:

 この問題は解決されていません。コントロール文字を '+' で連結する / しないによって挙動が変わるため、ソースコードを普通に眺めただけでは挙動を推測する事は不可能です。


UnicodeStringToUCS4String() / WideStringToUCS4String() がサロゲートペアを含む文字列を正しく変換しない (2010 以前で発生)

QC No:

Report No: 67959 Status: Closed
UnicodeStringToUCS4String / WideStringToUCS4String do not handle surrogate pairs correctly
http://qc.embarcadero.com/wc/qcmain.aspx?d=67959
QCWIN:Defect_No=67959

回避策:

注意:

 この問題は Delphi XE で解決されています。


Windows 2000 では WideCharToMultibyte() を利用している RTL のすべてが ISO-2022 系の文字コードを正しく処理しない (TEncoding を含む) (すべてのバージョンで発生)

QC No.

Report No: 78134 Status: Closed
WideCharToMultibyte() of Windows 2000 miscalculates the size of the buffer
http://qc.embarcadero.com/wc/qcmain.aspx?d=78134
QCWIN:Defect_No=78134

回避策

注意:

 この問題は解決されていません (Cannot Fix で Close)。原因は OS のバグですが、RTL の仕様としては正しくありません。ISO-2022-JP は日本においてメールのデファクトスタンダード的な文字コードですから、メール絡みのアプリケーションを作る時には注意が必要です。


HttpApp.HTMLEncode() は正しく動作しない (2010 以前で発生)

QC No.

Report No: 78903 Status: Closed
HTTPApp.HTMLEncode does not correctly encode a string
http://qc.embarcadero.com/wc/qcmain.aspx?d=78903
QCWIN:Defect_No=78903

回避策

注意:

 この問題は Delphi XE Update 1 で解決されています。文字コードとは直接関係ありませんが、HTTPApp.HTMLDecode() との往復変換が不可能になります。


Unicode 版の CharToElementIndex() / CharToByteIndex() は、文字列長が 1 の場合に正しく動作しない (2009 ~ XE2 で発生)

QC No.

Report No: 83508 Status: Close
When the string length is 1 and index is 1, the UnicodeString version of CharToElementIndex() returns 0.
http://qc.embarcadero.com/wc/qcmain.aspx?d=83508
QCWIN:Defect_No=83508

回避策

注意:

 Unicode 版 Delphi の問題です。この問題は XE3 で解決されています。Delphi の RTL は "コードポイント単位で文字列を操作する関数/クラス" を持っていないため、MECSUtils 等の外部ライブラリを使わずにコードポイント単位での文字列操作を行うには SysUtils.CharToElementIndex() が不可欠なのですが、その肝心な関数にバグが潜んでいます。


AnsiString を返す StringOf() がないため、 AnsiString と TBytes を往復変換する事ができない (Unicode 版 Delphi で発生)

QC No.

Report No: 83566 Status: Open
StringOf() of AnsiString version is not available.
http://qc.embarcadero.com/wc/qcmain.aspx?d=83566
QCWIN:Defect_No=83566

回避策

注意:

 Unicode 版 Delphi の問題です。この問題は解決されていません。


HTTPApp.HTMLDecode() は U+10000 以降 (サロゲートペア) の数値参照文字を正しく処理しない (XE 以前で発生)

QC No.

Report No: 87435 Status: Closed
HTTPApp.HTMLDecode() does not support surrogate pair.
http://qc.embarcadero.com/wc/qcmain.aspx?d=87435
QCWIN:Defect_No=87435

回避策

注意:

 この問題は XE2 で解決されています。Indy の IdStrings.StrHtmlDecode() はそもそも数値参照文字を処理しないので、この問題は発生しません。


 QC のうち、Vote できるものに関しては Vote をお願い致します。Vote の方法に関しては こちら をどうぞ。

 経験則ですが、QC を潰す最も効果的な方法は、Field Test 開始 1ヶ月以内 に Field Test 用フォーラムでガンガンプッシュする事です。この期間を過ぎると Access Vioration を引き起こすような重篤な問題が最優先されるため、どうしても後回しになってしまいます。それと、アップデータやHotFix による修正はあまり期待できません (問題のトリアージやってる人間の匙加減一つですから)。また、パッシブフェーズに入った製品のバグ修正は行われないので注意が必要です。


 BACK