2009-08-04 32 views
1

UI(フォーム、フォント、すべて)にC++ zAppフレームワークを使用するアプリケーションがあります。我々は徐々にそれを.netフレームワークを使用するように変換し、最近ギリシャ文字が正しく表示されていないことがわかりました。ギリシャ語のテキストが正しく表示されない

アプリケーションの1つのバージョンでは、同じデータを両方表示するC#.netフォームとC++ zAppフォームがあります。このプロジェクトは、MS Visual Studio 2005でコンパイルされ、.net 2.0を使用します。 .net形式では、ギリシャ語は正しく表示されません。 .netフォームからテキストをコピーしてzAppフォームに貼り付けると、zAppフォームに正しく表示されます。これは、データが正常にロードされていることと、すべての正しい情報が文字列内にあることを示しています。

.netコードで使用されているフォントを変更しようとしました。 zAppコードは、ギリシャ語を表示するコントロールのLOGFONT構造体を使用してフォントを作成します。私はzAppに使用されていた正確な値をとり、それらの値でLOGFONTを作成し、その構造(this.Font = Font.FromLogFont((オブジェクト)lFont);)を使用して.netフォームのフォントを設定しました。同じfacename、charsetなどを使用しました。LOGFONT構造のすべてが設定されています。ギリシャ語はまだ間違って表示されました。下線を引くとテキストに下線が引かれ、LOGFONTで設定した後にコントロールのフォント(this.Font)のプロパティを見ると、私は作成したフォントが使用されていることがわかりますそれらを期待してください。私は当初、真のタイプのフォントではないフォントで問題を抱えていましたが、zAppフォントを真のタイプのフォントに切り替えました。それでも私はテスト(Microsoft Sans Serif)に使用しました。

また、キーボードからギリシャ文字を入力すると、.net形式とzApp形式の両方で正しく表示されますが、.net形式で入力されデータベースに保存された文字は、 zAppフォームで保存されたデータとは異なります。繰り返しますが、.netフォームからガベージのように見えるテキストをコピーしてzAppフォームに貼り付けると、データは失われません。

誰にもアイデアはありますか?

答えて

1

テキストを正しく.net形式で表示する方法を知りました。それは実際にフォントとは関係がなく、.netのデータを変換することともっと関係していました。私はまだこれが正常に動作している他の言語のクライアントの使用のいずれかに問題が発生しないことを確認する必要があります

string Name = System.Text.Encoding.Default.GetString(reader.GetOracleString(column).GetNonUnicodeBytes()); 

string Name = reader.GetString(column); 

:私はこのような基本的だったのコードを変更しましたしかし、これまでのところ、ギリシア語と英語ではよく見えます。

これで、保存するOracleCommandパラメータを追加するときに、そのプロセスを元に戻す必要があります。元のコードは次のようになりました。

cmd.Parameters.Add(new OracleParameter(":name", Name)); 

ごみを節約します。文字列 "Name"の値は正常に見えます。アンマネージC++コードは、SQL文を文字配列にまとめます(ギリシャ語のテキストも常にchar配列で処理されます)。そして、OCI関数(OracleのAPI)を呼び出して実行します。 .netコードは、データベースアクセスにODAC(Oracle Data Access Client)を使用しています。

UPDATE:私は私の問題(保存)の第二の部分を解決し、何が起こっているかについての詳細を学びました

のデータをOracleから.NETに入ってくるが、私は任意の変換を行わず、.NET文字列データ型に入れたときに、メモリに次のようになります。

00 0A 33 79 07 00 00 00 06 00 00 00 d4 00 e1 00 ec 00 e5 00 df 00 ef 00 00 00 00 00 00 00 00 00 00 .. 3y ........Τ.α.μ.ε.ί.ο..... .NETで誤っ.......

この文字列が表示さとして::
Ôáìåßï

変換後のNETの文字列(変換コードは、上記に示す)のメモリ内容 00 0a 33 79 07 00 00 00 06 00 00 a4 03 b1 03 bc 03 b5 03 af 03 bf 03 00 00 00 00 00 00 00 00 00 00 .. 3y ........。 ±.Ό.μ.-あなたはすべての文字のために、3は下位バイトの上位ニブルから撮影されていると高いに入れていることがわかります。Ώ............

バイト。
文字列が今のように.NETで正しく表示されますが示す上記の情報として
Ταμείο

、.NETは、異なる管理されていないC++とOracle以外の文字を表しているようです。私はいくつかのテストを行い、ブレークポイントが160(16進値a0)であることを発見しました。したがって、0〜159(00〜9f)の文字値を使用する場合は、違いはありません。 160以上の値が使用されるとすぐに違いがあります。

私の解決策は、変換で文字の上位バイトを削除するため、0〜255の文字値に対してのみ機能します。とにかくマルチバイト文字セットをサポートしていないので、これは私たちのアプリケーションではうまくいくはずです。

私はOracleに保存するためのフォーマットに戻って文字列を変換するためにやっているの簡易版は、次のとおりです。

//"name" represents a .net string data type containing the data to save 

char[] textChars = new char[4000]; //4000 is the max varchar2 column size in Oracle 
byte[] textBytes; 
int index = 0; 
textBytes = (System.Text.Encoding.Default.GetBytes((name).ToCharArray())); 
foreach (byte textByte in textBytes) 
{ 
    textChars[index++] = (char)textByte; 
} 
string textString = new string(textChars, 0, index); 
cmd.Parameters.Add(new OracleParameter(":name", (object)(textString))); 

この全体のことは、このようなハックです - 誰もが、より良い方法をしてください持っている場合共有する。この問題全体を処理する簡単な方法があるはずです。

+0

OracleテキストがUTF-8ではありませんか?私は、高次のビットは、与えられた文字にさらに多くのバイトがあるかどうかを定義するために使用されることを知っています。したがって、UTF-8では、すべての文字が同じ長さであるわけではありません。あなたのソリューションは、通常のラテン文字では機能しません。 –

+0

テキストはVARCHAR2に格納されるため、WE8ISO8859P1文字セットを使用します。 (AL16UTF16はNLS_NCHAR_CHARACTERSETの設定です)。 – AAyres

2

私はC#で小さなテストアプリケーションを作成し、ελληνικάというギリシャ語のテキストを持つボタンを作成しました。ボタンにテキストを設定すると、Visual StudioはUnicodeに切り替えるかどうか尋ねました。私は「はい」と答えました。その後、ギリシア語のテキストが私のボタンに表示されました。

私は、Visual Studioまたはアプリケーション設定の一部のプロパティが正しく設定される必要があると思われます。

編集:

あなたの答えであなたの更なる情報は、OracleデータベースからのテキストはUTF-8かもしれないと信じて私をリード。そうであれば、上位ビットのいくつかを使用して、与えられた文字にさらに多くのバイトがあるかどうかを定義します。したがって、すべての文字が同じバイト長であるとは限りません!あなたは解決策が働かないかもしれません。

Encoding.UTF8.GetString() 
+0

私のプロジェクトはすでにUnicodeを使用していると確信しています。だから、もし私が.netフォームからテキストを取り出してzAppフォームに貼り付ければいいのです。キャラクターからのデータの損失はありません。しかし、単にあなたの提案をテストするために私がプロジェクトにボタンで新しいフォームを追加し、Unicodeに切り替えるには任意のプロンプトを取得できませんでした。同じ方法で表示されます。キーボードからギリシャ語を入力すると大丈夫ですが、データベースのギリシャ語とzAppフォームは表示されません。私は、Oracleデータベース内で働いている – AAyres

+0

文字は常に私がWE8ISO8859P1について読んだものに基づいて、単一バイト長でなければなりません。 – AAyres

+0

.netで表示するためにUTF-16に変換する必要があるようです。 Oracaleのデータは1バイトで、上の私のソリューションはUTF-16に正しく変換され、.netで正しく表示され、Oracleのストレージ用のシングルバイト文字データに変換され、アンマネージC++で表示されます。あなたに正しい音ですか? – AAyres

関連する問題