質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1832閲覧

Transformerを使用したサロゲートペアの出力について

momo1234567890

総合スコア2

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/05/18 14:50

編集2022/05/18 14:55

以下のようにTransformerを使用してxmlを出力しましたが、サロゲートペア文字を含む場合、文字参照で表示されます
「𠀋」と出力するには、どのようにすれば良いでしょうか?

サロゲート文字: 𠀋
出力:𠀋(文字化けするためセミコロンを全角にしてあります)

java

1 2package xml; 3 4import java.io.File; 5 6import javax.xml.parsers.DocumentBuilder; 7import javax.xml.parsers.DocumentBuilderFactory; 8import javax.xml.parsers.ParserConfigurationException; 9import javax.xml.transform.Transformer; 10import javax.xml.transform.TransformerConfigurationException; 11import javax.xml.transform.TransformerException; 12import javax.xml.transform.TransformerFactory; 13import javax.xml.transform.dom.DOMSource; 14import javax.xml.transform.stream.StreamResult; 15 16import org.w3c.dom.Document; 17import org.w3c.dom.Element; 18 19public class XMLClass { 20 21 static String kenmei[] = {"T𠀋okyo", "Kanagawa","Chiba","Saitama","Gunma","Tochigi","Ibaraki"}; 22 23 public static void main(String[] args) { 24 25 // Documentインスタンスの生成 26 DocumentBuilder documentBuilder = null; 27 try { 28 documentBuilder = DocumentBuilderFactory.newInstance() 29 .newDocumentBuilder(); 30 } catch (ParserConfigurationException e) { 31 e.printStackTrace(); 32 } 33 Document document = documentBuilder.newDocument(); 34 // standalone 属性を記述しない 35 document.setXmlStandalone( true ); 36 37 // XML文書の作成 38 Element nihon = document.createElement("nihon"); 39 document.appendChild(nihon); 40 Element chiiki = document.createElement("kanto"); 41 nihon.appendChild(chiiki); 42 for (int i = 0; i <= 6; i++ ) { 43 Element ken = (Element) document.createElement("ken").cloneNode(false); 44 chiiki.appendChild(ken); 45 ken.appendChild(document.createTextNode(kenmei[i])); 46 } 47 48 // XMLファイルの作成 49 File file = new File("Kanto.xml"); 50 write(file, document); 51 } 52 53 54 public static boolean write(File file, Document document) { 55 56 // Transformerインスタンスの生成 57 Transformer transformer = null; 58 try { 59 TransformerFactory transformerFactory = TransformerFactory 60 .newInstance(); 61 transformer = transformerFactory.newTransformer(); 62 } catch (TransformerConfigurationException e) { 63 e.printStackTrace(); 64 return false; 65 } 66 67 // Transformerの設定 68 transformer.setOutputProperty("indent", "yes"); //改行指定 69 transformer.setOutputProperty("encoding", "UTF-8"); // エンコーディング 70 transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");//インデントの桁指定 71 72 73 74 // XMLファイルの作成 75 try { 76 transformer.transform(new DOMSource(document), new StreamResult( 77 file)); 78 } catch (TransformerException e) { 79 e.printStackTrace(); 80 return false; 81 } 82 83 return true; 84 } 85} 86

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

復元できるなら&#131083;のままでいいとおもいますがそれが不満なのであれば、UTF-16にすればいいのでは?

diff

1- transformer.setOutputProperty("encoding", "UTF-8"); // エンコーディング 2+ transformer.setOutputProperty("encoding", "UTF-16"); // エンコーディング

xml

1<?xml version="1.0" encoding="UTF-16"?><nihon> 2 <kanto> 3 <ken>T𠀋okyo</ken> 4 <ken>Kanagawa</ken> 5 <ken>Chiba</ken> 6 <ken>Saitama</ken> 7 <ken>Gunma</ken> 8 <ken>Tochigi</ken> 9 <ken>Ibaraki</ken> 10 </kanto> 11</nihon>

投稿2022/05/19 00:15

編集2022/05/19 00:17
shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momo1234567890

2022/05/19 04:13

すみません、文字コードについて、何度も文献を読み勉強はしているのですが、なかなか上手く理解できておりません。 関連して、質問させてください。 org.apache.commons.io.FileUtils.writeStringToFile(file,”𠀋“,StandardCharset.UTF_8)でファイル出力をし、それをサクラエディタなどで文字コードをUTF-8の状態で開くと、”𠀋”と表示出来るのは何故なのでしょうか?
shiketa

2022/05/19 05:17 編集

エディタの問題ではないですね。 XML的には、空白(0x20)を` `と書いてもいいし`&#x20;`と書いてもいいし`&#32;`と書いてもいい。同様に「𠀋」を`𠀋`と書いてもいいし`&#131083;`と書いてもいい。 JDKがデフォルトで提供するTransformerは、UTF-8のときサロゲートペア文字を`&#131083;`のような形でエスケープして出力する仕様なのでしょう。 * https://docs.oracle.com/javase/jp/8/docs/api/javax/xml/transform/TransformerFactory.html TransformerFactoryが提供するTransformerFactoryの実装クラスはシステムプロパティjavax.xml.transform.TransformerFactoryで設定できます。目的のカタチで出力する Transformer を返す、TransformerFactoryを実装すればあなたの好きなカタチで出力できると思います。
momo1234567890

2022/05/19 06:03

大変納得できました。 ずっと不思議だと思っていましたが、腑に落ちました。 大変ありがとうございます。 これからも勉強を続けます! ありがとうございました。
shiketa

2022/05/19 06:40

かなり乱暴ですが、生成されたXMLを操作する、という手も。 ```java // XMLファイルの作成 try { // transformer.transform(new DOMSource(document), new StreamResult(file)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); transformer.transform(new DOMSource(document), new StreamResult(baos)); String xml = baos.toString(); while (true) { Matcher ma = Pattern.compile(".*(\\&#(\\d+);).*", Pattern.DOTALL).matcher(xml); if (!ma.matches()) break; final String g1 = ma.group(1); final String g2 = ma.group(2); final String text = new String(new int[] { Integer.parseInt(g2) }, 0, 1); xml = xml.replaceAll(g1, text); } PrintStream ps = new PrintStream(new FileOutputStream(file), true, "UTF-8"); ps.print(xml); ps.close(); } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問