0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

絵文字をPOSTした際の数値参照形式を絵文字に戻す方法

Last updated at Posted at 2024-09-30

1.背景

JSPの実装にて入力フォームに入力した絵文字を次ページの確認画面で表示する際に
数値変換形式に変換されてしまうため、絵文字で表示をするためにJavaScrpitにて処理を実装しました。

例:入力内容→😃
数値変換形式→ 😃
 上記を表示時に、😃へ戻す

2. 入力画面、受け取り画面について

以下は入力テキストとPOSTするボタンのみ配置の画面

inputForm.jsp
<%@ page contentType="text/html; charset=Windows-31J" %>
<html>
<head>
    <title>送信データを扱うJSP</title>
</head>
<body onload="document.getElementById('hiddenButton').click();">
<h2>POST送信フォーム</h2>
<form action="jspReceipt.jsp" method="post">
    入力:
    <input type="text" name="htmlEntity" id="htmlEntity">
    <input type="submit" value="送信">
</form>
</body>
</html>

以下は入力された内容を表示する画面

jspReceipt.jsp
<%@ page contentType="text/html; charset=Windows-31J" %>
<%
    // POSTされた絵文字
    String htmlEntity = request.getParameter("htmlEntity");
%>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="emojiHenkan.js"></script>
<script type="text/javascript">
// ページがロードされた後に処理を行う
window.addEventListener('load', function() {
    // 初期表示時に関数を呼び出す
    replaceNumericReferenceWithEmoji('<%= htmlEntity %>');
});
</script>
    <meta charset="UTF-8">
    <title>入力内容の表示</title>
</head>
<body>
<div id="outputDiv"></div>
<br/>
</body>
</html>

3. 変換処理を行うJavaScript

以下、数値変換形式と絵文字をセットの配列を作成して、入力された内容に対して最終的に置換を行う。

emojiHenkan.js
// 数値参照形式から絵文字に変換する非同期関数
async function convertNumericReferenceToEmoji(numericReference) {
    return new Promise((resolve, reject) => {
        // 数値形式部分を取り出す
        var numericParts = numericReference.match(/&amp;#(\d+);/g);
        if (!numericParts) return resolve([]);

        var emojis = numericParts.map(function(numericPart) {
            // 数字を10進数として解釈し、絵文字に変換
            var codePoint = parseInt(numericPart.replace(/[&amp;#;]/g, ''), 10);
            return String.fromCodePoint(codePoint);
        });

        // numericPartsとemojisをセットにした配列を作成
        var pairedArray = numericParts.map(function(numericPart, index) {
            return [numericPart, emojis[index]];
        });

        resolve(pairedArray);
    });
}

// 数値参照形式を絵文字に置き換える関数
async function replaceNumericReferenceWithEmoji(htmlEntity) {
    try {
        var pairedArray = await convertNumericReferenceToEmoji(htmlEntity);
        
        // 数値参照形式を絵文字に置き換える
        var replacedText = htmlEntity;
        pairedArray.forEach(function(pair) {
            replacedText = replacedText.replace(pair[0], pair[1]);
        });
        
        // 置換されたテキストを画面に表示
        document.getElementById("outputDiv").innerHTML = replacedText;
    } catch (error) {
        console.error('Error:', error);
    }
}

4. 終わりに

今回は入力画面も表示画面も、仕様上の誤動作のリスクに備えて、UTF-8には変換できず、Windows-31Jのままで使用することがあったため、JavaScriptで無理やり変換しております。
JavaでUTF-8に変換して表示させる方法では文字化けが解消されず、StringEscapeUtils.unescapeHtml4では、SQLインデクションを解消できず、やめました。

上記は割と自作になるのでご使用の際はご注意を。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?