私の Grails アプリケーションでは、Groovy のXmlParserを使用して XML ファイルを解析しています。私の XML ファイルの属性の 1 つの値は、文字の 16 進コードに等しい文字列です。その文字列をデータベースに保存したい:
Ñ
残念ながら、属性メソッドはÑ文字を返し、実際にデータベースに格納されるのは ですc391
。フィールドが読み戻されると、望ましくないÑ文字も取得されます。
データベースに 16 進コードを文字列として保存し、16 進コードとして読み戻されるようにするにはどうすればよいですか?
更新 #1:
これが私にとって問題である理由は、XML ファイルをデータベースに読み取った後、それを元どおりに再構築できなければならないからです。追加の問題は、問題のフィールドが常に文字の 16 進コードであるとは限らないことです。任意の文字列である可能性があります。
更新 #2:
拡張された 16 進コード形式で文字を書き戻すことができる限り、文字がデータベースにどのように格納されているかは問題ではないと思います。Groovy MarkupBuilderを使用してデータベースから XML ファイルを再構築していますが、デフォルトでこれが行われない理由がわかりません。
更新 #3:
カスタムの MySQL ダイアレクトを上書きgetTableTypeString
しましたが、それが何かの助けになったようです。少なくとも、MySQL に渡す値は、データベースに格納される値です。
class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8"
}
}
独自のバージョンのgroovy.util.XmlParserも作成しました。私のバージョンは、私が変更した方法をgroovy.util.XmlParser
除いて、ほぼ正確に複製されています。startElement
String value = list.getValue(i)
これに:
def value = list.fAttributes.fAttributes[i].nonNormalizedValue
if(value ==~ /&#x([0-9A-F]+?);/) {
value = list.fAttributes.fAttributes[i].nonNormalizedValue
}
これにより、16 進コード要素の正確なテキストをデータベースに格納できます。
現在、2 つ、おそらく 3 つの新しい問題があります。
データベースに保存されている正確な値でファイルを再作成します。これまでは を使用していましたが
MarkupBuilder
、アンパサンドで余分なエンコーディングを行っているため、XML 文字列を手動で 破棄して構築することでおそらくこれを回避できるため、値Ñ
が書き出されてしまいますが、むしろそうしたくありません。Ñ
MarkupBuilder
Saxon-HE 9.4 プロセッサを使用して XML ファイルに対して XSLT 変換を実行すると、一部の 16 進コード値がÿ
ÿ
のような値に変更されますが、その他の値は変更されません。™
これが問題になるかどうかはまだわかりませんが、ファイルを再作成するときは
ANSI
、元のファイルに使用されているエンコーディングであるため、エンコーディングにしたいと考えています。