2011-10-03 12 views
5

Excelスプレッドシートから取得した文字列の望ましくない文字を置き換えようとしています。私たちのOracleデータベースがWE8ISO8859P1文字セットを使用しているのは、Excelが「有益に」テキストに挿入する複数の文字を定義していないからです(中引用、emとenダッシュなど)。私はデータベースまたはExcelスプレッドシートの作成方法を変更する必要があります。Excelから読み取られた文字列の特定のUnicode文字を置換する

は、私は、このように文字列にセルの内容を取得します。Visual Studioのテキストビジュアライザ内の文字列を表示する

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim(); 

は、完全かつ正確に取得するテキストを示します。次の私が試してみて、望ましくないのいずれかの文字を置き換える(この場合は右カーリー引用記号):

s = Regex.Replace(s, "\u0094", "\u0022"); 

しかし、それは(テキストビジュアライザが、それはまだそこにあることを示して)何もしません。置き換えたい文字が実際にそこにあることを確認するために、私は試しました:

bool a = s.Contains("\u0094"); 

ただし、falseを返します。ただし、

bool b = s.Contains("”"); 

がtrueを返します。

.NETでの文字列の理解は、UTF-16でエンコードされていますが、ExcelではANSIが使用されている可能性があります。それで、Excelから出てくるテキストのエンコーディングを変更する必要があるのですか?あるいは私はここで何か他のことをやっていますか?アドバイスをいただければ幸いです。私はUnicodeとエンコーディングについて知ることができるすべての記事を読んで再読しましたが、まだ賢明ではありません。

答えて

4

はい.Netの文字列はUTF-16です。

これは正しいことです。おそらくあなたの16進数は間違っています。 あなたがテストしたキャラクターは"\u0094"ではありません。以下は私のために働いた:

((int)"”"[0]).ToString("X")戻り"201D"

"”" == "\u201D"戻りtrue

"\u0094" == ""は(右側が空の文字列です)UTF-16文字の多くのように思えますfalse

を返します。テキストビジュアライザーによって空の文字列が表示されますが、表示されない文字または代理の一部である可能性があります(つまり、一部の文字は"\UXXXXXXXX"と入力する必要があります。 nとする(4桁)"\uXXXX"。)。このドメインに関する私の知識は非常に限られています。

参考資料 - 上Jon Skeetの記事:

+0

はい、あなたは正しく、私の16進値は途方に暮れていました。私はUTF-16の代わりにWIN1252文字セットのコードポイントを使用していたことがわかります。ある日、私はこれをすべて理解していきます(それには、理解できないほど複雑なものがあります)。答えをありがとう。 –

2

あなたはそれらの文字を収容する必要がある列に対してNVARCHARとNTEXTの代わりにVARCHARとTEXTを使用することができます。 この方法では、データベース全体を変換する必要はなく、将来的には列がUnicodeになるため、あなたは証明します。

+0

はい、これは理想的ですが、悲しいことに私はデータベースを制御できません。 –

+0

@SidHollandここで何か助けてください? :) http://stackoverflow.com/questions/36393449/special-characters-in-oracle-nclob –

関連する問題