2

テキストエンコーディングに小さな問題があります。

SQL Server 2008データベースからロードしている2つの文字列があります(nvarchar-field)

データベースからそれらをロードした後、VisualStudio2010はウォッチウィンドウに次のように表示します。

str1 = "Test"
str2 = "Test"

しかし、str1 = str2リターンとの比較False

これらの文字列をUTF8エンコーディングを使用してファイルに書き込むと、期待どおりの結果が得られます。

テスト
テスト

これらの文字列をANSI(デフォルト)でファイルに書き込むと、結果は期待どおりにエンコードされません。

?テスト
テスト

文字列をバイトに変換する:

System.Text.Encoding.Default.GetBytes(str1) 'Returns ByteArray {63, 84, 101, 115, 116}
System.Text.Encoding.Default.GetBytes(str2) 'Returns ByteArray {84, 101, 115, 116}

System.Text.Encoding.UTF8.GetBytes(str1) 'Returns ByteArray {239, 187, 191, 84, 101, 115, 116}
System.Text.Encoding.UTF8.GetBytes(str2) 'Returns ByteArray {84, 101, 115, 116}

ANSIエンコーディングの場合のバイト63、またはstr1のUTF8エンコーディングの場合のバイト239、187、191はどこから来ていますか?

さて、バイト239、187、191はUTF8のBOMです。ここでの質問は、おそらく次のようになります。str1のBOMを取得するのに、str2のBOMを取得しないのはなぜですか。

(値は、データベースに挿入するWebサービスに渡される値です。初期値は、私が制御できないクライアントによってこのWebサービスに渡されます)

4

3 に答える 3

3

念のために言っておきますが、データベース内の 2 つの異なるレコードから 2 つの文字列を読み取りますよね? 2 つの異なる方法で 1 つのレコードからではありませんか?

では、誰かが BOM を 1 つのレコードに格納しました。BOM は印刷時に見えないため、視覚的な違いはわかりません。文字列を BOM を保存できないエンコーディングに変換しない限り。
それが上で起こることです。

これを解決するには、データベースをクリーンアップする必要があります。すべてのレコードを読み取り、BOM で始まるかどうかを確認し、そうであれば、コンテンツを (BOM なしで) 書き戻します。

編集:このデータベースはWebサービスによってオンザフライで作成されたとあなたが言ったことに後で気づきました。その場合の解決策は、Web サービスの作成者に連絡して、ルーチンにバグがあることを伝えることです。

于 2012-04-11T11:15:13.233 に答える
1

あなたは自分で答えました:「値は、それらをデータベースに挿入するWebサービスに渡される値です。初期値は、私が制御できないクライアントによってこのWebサービスに渡されます」

そこに BOM が挿入されます。データがどのように挿入されたか、また、str1 には BOM があり、str2 には BOM がなくても挿入された理由を確認してください。

于 2012-04-11T11:19:19.830 に答える
1

データを SQL にインポートするときに、これが発生するのを見たことがあります。実際には、インポートは CSV ファイルからの一括インポートによるものでした。これにより、最初の行の最初の列のデータに BOM が含まれるため、データが無効になりました。

解決策は、データベースをクリーンアップすることですが、ファイルからのすべての新しいインポートが挿入前にクリーンアップされていることも確認してください。

于 2012-04-11T11:20:51.940 に答える