2009-09-04 23 views
6

エンコードに問題があります。 UTF-8でエンコードされたファイルのデータをSQL Server 2008データベースに格納したいSQL ServerにはUCS-2エンコーディングしかないので、取得したデータを明示的に変換することに決めました。SQL Server 2008にUTF8データを挿入

// connect to page file 
_fsPage = new FileStream(mySettings.filePage, FileMode.Open, FileAccess.Read); 
_streamPage = new StreamReader(_fsPage, System.Text.Encoding.UTF8); 

は、ここでデータの変換ルーチンです:

private string ConvertTitle(string title) 
{ 
    string utf8_String = Regex.Replace(Regex.Replace(title, @"\\.", _myEvaluator), @"(?<=[^\\])_", " "); 
    byte[] utf8_bytes = System.Text.Encoding.UTF8.GetBytes(utf8_String); 
    byte[] ucs2_bytes = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.Unicode, utf8_bytes); 
    string ucs2_String = System.Text.Encoding.Unicode.GetString(ucs2_bytes); 

    return ucs2_String; 
} 

重要なタイトルのコードをステップ実行、変数のウォッチは、両方のUTF-8およびUCS-2文字列の正しい文字が表示されます。しかし、データベースでは - 部分的に間違っています。一部の特殊文字は正しく保存されますが、他の文字は正しく保存されません。

  • 誤:nは
  • Nとなる右:EまたはEが正しく挿入され、例えばあります。

問題の原因と解決方法を教えてください。事前に

Thans、 フランク

答えて

6

は、私はあなたがエンコーディングが何であるかの誤解があると思います。エンコーディングは、一束のバイトを文字列に変換するために使用されます。文字列自体にエンコーディングは関連付けられていません。

内部的には、文字列はUTF-16LEバイトとしてメモリに格納されます(これは、WindowsがUTF-16LEエンコーディングを "Unicode"だけで呼び出すことによって誰もが混乱させている理由です)。しかし、あなたはそれを知る必要はありません - あなたには、文字の文字列だけです。あなたの関数は何

は次のとおりです。

  1. は、文字列をとり、UTF-8バイトに変換します。
  2. これらのUTF-8バイトをUTF-16LEバイトに変換します。 (ステップ1でUTF-8の代わりにUTF-16LEにまっすぐにエンコードすることができます)
  3. これらのUTF-16LEバイトを取り込んで文字列に変換し直します。これは、あなたが最初に持っていたものとまったく同じStringを提供します!

この機能は冗長です。実際に.NETからSQL Serverに通常のStringを渡すだけで、それについて心配する必要はありません。

バックスラッシュのビットは何かをしますが、おそらくアプリケーション固有のものですが、私はそれが何のために理解できません。しかし、その機能では、Windowsにńからnのような文字を平坦化させるものはありません。

データベースの独自のエンコーディングに含まれていない文字をデータベースに配置しようとすると、そのような平坦化の原因となるのは何ですか。おそらくéは、その文字がcp1252西ヨーロッパ言語のデフォルトエンコードになっているため、OKであると思われますが、そうではありません。

SQL Serverでは、Unicode文字列を格納するのに 'UCS2'(実際にはUTF-16LE)を使用しますが、通常はCHARではなくNATIONAL CHARACTER(NCHAR/NVARCHAR)列型を使用します。

+0

このエンコード/ Unicode/UTFの情報は、まだ頭痛を与えています。とにかく、あなたは頭の爪に当たった。列をvarcharからnvarcharに変更すると、文字が正しく格納されます。どうもありがとう! – Aaginor

11

SQL Server 2008には、あなたのためのUCS-2へのUTF-8からの変換を処理します。

最初に、SQLテーブルが列のnchar、nvarcharデータ型を使用していることを確認してください。次に、エンコードされた文字列の前にNを追加して、Unicodeデータの送信をSQL Serverに伝える必要があります。

INSERT INTO tblTest (test) VALUES (N'EncodedString') 

マイクロソフトhttp://support.microsoft.com/kb/239530

から

は、ここに私の質問と解決策を参照してください:新しいリリースを使用して、将来の読者のためにHow do I convert UTF-8 data from Classic asp Form post to UCS-2 for inserting into SQL Server 2008 r2?

+0

ありがとうございます。あなたは私の瞬間を作りました;) –

0

を、SQL Serverの2016年にはそのbcpユーティリティでUTF-8をサポートしていることに注意してください。