2017-10-26 27 views
1

xml要素をXQueryでcsvにエクスポートするために、eXist-dbに基づくWebアプリケーションで関数を書きました。すべてうまく動作しますが、自分の要素にü、äまたはßのようなウムラウトがありますが、それは私のCSVに間違った方法で表示されます。私はfn:normalize-unicodeを使ってコンテンツをエンコードしようとしましたが、これは動作しません。ここ は私のコードスニペットのminimalized例です。XQueryでのエンコード文字列

let $input = 
    <root> 
     <number>1234</number> 
     <name>Aufmaß</name> 
    </root> 

let $csv := string-join(
    for $ta in $input 
     return concat($ta/number/text(), fn:normalize-unicode($ta/name/text()))) 

let $csv-ueber-string := concat($csv-ueber, string-join($massnahmen, $nl)) 

let $set-content-type := response:set-header('Content-Type', 'text/csv') 
let $set-accept := response:set-header('Accept', 'text/csv') 
let $set-file-name := response:set-header('Content-Disposition', 'attachment; filename="export.csv"') 

return response:stream($csv, '') 
+0

だから、/どのようにあなたのXQueryを実行しない場合は、どのように結果を保存したり、保存するか、どのようにあなたは結果を見てください、そのエンコーディングは、あなたがしたいですかあなたのCSVのために? –

+0

私はeXist-dbに基づくWebアプリケーションでXQueryを使用しています。私は結果を関数レスポンスで保存します:stream()(私は最初の投稿を編集しました)。 CSVをダウンロードした後、私はそれをExcelで開き、エンコーディングが実際には機能していないことに気付きました。まあ、私は文字列をエンコーディングする初心者ですが、utf-8またはcp1250は作業を行う必要があります。 – Felix

+0

ソリューションの一部が 'response:set-header'や' response:stream'のような関数に適切なオプションや設定を使用していると確信しているので、eXist用のタグを追加したいかもしれません。 –

答えて

1

それはあなたのクエリに何か問題があることを確かに非常に低いのですか、これを修正するために、クエリで何かできることがあること。問題が

のいずれかである可能性が高い

(a)のクエリに渡される入力データは、クエリプロセッサは、それが

(b)の出力データであると考えるものとは異なる文字エンコーディングでありますあなたのクエリからは、出力の受信者がそれと考えるものとは異なる文字エンコーディングになっています。

照会をすばやく見ると、実際に照会ソースコード自体に外部入力がないことが示唆されます。しかし、ソースコードは入力の1つであり、エラーの可能性があります。あなたはそれで問題が解決した場合は、その後、クエリのソーステキストは、そのクエリのエンコーディングではありません

<name>Aufma{codepoints-to-string(223)}</name> 

によって

<name>Aufmaß</name> 

を交換する場合は、この可能性を排除するための良い方法は何が起こるか見るためにあるかもしれませんコンパイラはそうだと思う。

もう1つの可能性は、問題が出力側にあり、率直に言えば、これはもっとそうであるようです。 HTTPレスポンスストリームを出力として生成し、HTTPヘッダーを自分で作成しているようです。 HTTP応答ヘッダーに特定のエンコーディングを設定しているという証拠はありません。レスポンス:stream()関数はベンダー固有のもので、詳細は分かりませんが、UTF-8でコンテンツをエンコードする必要があり、HTTPヘッダーでUTF-8であることを確認する必要があると思われます。これは、関数への余分なパラメーターによって、または外部構成オプションによって可能性があります。

1

期待どおり、eXistはCSVをUnicode(UTF-8)としてシリアライズしています。しかし、export.csvファイルをExcelで直接開くと(つまり、File > Open経由で)、ExcelはCSVファイルのエンコードを推測するのに最善の努力をします。しかし、CSVファイルにはエンコードを宣言する方法がないため、アプリケーションがExcelのように聞こえるように間違っているかもしれません。私のコンピュータ上では、ExcelはAufmaßのエンコーディングをAufmaßと誤って解釈します。クエリで生成されたようなUTF-8でエンコードされたCSVファイルのエンコードをExcelに強制的に使用させる方法は次のとおりです。 Excelで

  • 、CSVファイルをインポートする方法を指定でき一連のダイアログを起動するために選択File > ImportFile > New
  • を経由して新しいスプレッドシートを起動します。
  • 最初のダイアログで、ファイルの種類として「CSVファイル」を選択します。
  • 「テキストインポートウィザード - ステップ1/3」という次のダイアログで、「ファイルの起源」として「Unicode(UTF-8)」を選択します。 (少なくともこれらは、Mac 2016用のMS Excelのコピーのタイトル/注文です)。
  • ダイアログの残りの部分に進み、デフォルト値を維持します。
  • Excelは、export.csvの内容を新しいスプレッドシートに配置します。

最後に、私は私がテストし、上記の指示に従ったときに期待として存在によって生成CSVファイルが開かないことを確認するために使用される次のクエリを提供してみましょう。クエリは本質的にあなたのものと同じですが、クエリの中でいくつかの問題を修正して、それを直接実行することを妨げました。私は/db/csv-test.xqでこのクエリを保存し、http://localhost:8080/exist/rest/db/csv-test.xq経由で呼ばれ、

xquery version "3.1"; 

let $input := 
    <root> 
     <number>1234</number> 
     <name>Aufmaß</name> 
    </root> 
let $cell-separator := "," 
let $column-headings := $input/*/name() 
let $header-row := string-join($column-headings, $cell-separator) 
let $body-row := string-join($input/*/string(), $cell-separator) 
let $newline := '&#10;' 
let $csv := string-join(($header-row, $body-row), $newline) 
return 
    response:stream-binary(
     util:string-to-binary($csv), 
     "text/csv", 
     "export.csv" 
    ) 
関連する問題