web-dev-qa-db-ja.com

Javascript文字列をISO-8859-1にトランスコードするにはどうすればよいですか?

ISO = 8859-1を使用するWebサイトで機能するChrome拡張機能を書いています。コンテキストを説明するために、私の拡張機能は、サイトのフォーラムにより便利な投稿フォームメッセージが書き込まれるtextareaの値は、Ajax呼び出し(jQueryを使用)を介して送信されます。

メッセージにáのような文字が含まれている場合、これらの文字は投稿されたメッセージでáとして表示されます。ブラウザにISO-8859-1ではなくUTF-8を強制的に表示させると、áが正しく表示されます。

JavaScriptは文字列にUTF-8を使用していると私は理解しています。そのため、送信する前に文字列をISO-8859-1にトランスコードすると、問題が解決するはずです。ただし、Javascriptでこのトランスコーディングを行う直接的な方法はないようで、サーバー側のコードには触れられません。何かアドバイス?

作成したフォームを次のようにiso-8859-1を使用するように設定してみました。

var form = document.createElement("form");
form.enctype = "application/x-www-form-urlencoded; charset=ISO-8859-1";

そしてまた:

var form = document.createElement("form");
form.encoding = "ISO-8859-1";

しかし、それはうまくいかないようです。

編集:

問題は、jQueryがメッセージ(または途中の何か)をurlencodingする方法にありました。次のスニペットに示すように、jQueryにデータを処理しないように指示し、自分で行うことでこれを修正しました。

function cfaqs_post_message(msg) {
  var url = cfaqs_build_post_url();
  msg = escape(msg).replace(/\+/g, "%2B");
  $.ajax({
    type: "POST",
    url: url,
    processData: false,
    data: "message=" + msg + "&post=Preview Message",
    success: function(html) {
      // ...
    },
    dataType: "html",
    contentType: "application/x-www-form-urlencoded"
  });
}
19
Marcos Marin

私の理解では、JavaScriptは文字列にUTF-8を使用しています

いいえ、違います。

各ページには、メタタグで定義された文字セットエンコードのすぐ下ヘッド要素があります

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

または

<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>

その上、各ページは、ターゲットの文字セットエンコーディングで編集する必要があります。そうしないと、期待どおりに動作しません。

また、サーバー側でターゲット文字セットエンコーディングを定義することをお勧めします。

Java
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

PHP
header("Content-Type: text/html; charset=UTF-8");

C#
I do not know how to...

また、機密性の高い文字(á、é、í、ó、úなど...)を使用するかどうかに関係なく、各スクリプトファイルを設定することをお勧めします。

<script type="text/javascript" charset="UTF-8" src="/PATH/TO/FILE.js"></script>

...

ですから、送信する前に文字列をISO-8859-1にトランスコードすると、問題が解決するというのが私の理論です。

いいえ、違います。

ターゲットサーバーは、ISO-8859-1以外の文字列を処理できました。たとえば、Tomcatは、ページの設定方法に関係なく、ISO-8859-1で処理します。したがって、サーバー側では、ページの設定方法に応じてリクエストを設定する必要があります。

Java
request.setCharacterEncoding("UTF-8")

PHP
// I do not know how to...

ターゲットの文字セットエンコーディングを変換したい場合は、次のようにTRYしてください。

InternetExplorer
    formElement.encoding = "application/x-www-form-urlencoded; charset=ISO-8859-1";
ELSE
    formElement.enctype  = "application/x-www-form-urlencoded; charset=ISO-8859-1";

Or各文字で使用される数値表現をUnicode文字セットで取得する関数を提供する必要があります。ターゲットの文字セットエンコーディングに関係なく機能します。たとえば、áUnicode文字セットは\ u00E1です。

alert("á without its Unicode Character Set numerical representation");
function convertToUnicodeCharacterSet(value) {
    if(value == "á")
        return "\u00E1";
}
alert("á Numerical representation in Unicode Character Set is: " + convertToUnicodeCharacterSet("á"));

ここ 動作を確認できます:

これはガイドラインとして使用できます リンク (JavaScriptエスケープを参照)

jQueryの機能を実装する方法を元の回答に追加しました

var dataArray = $(formElement).serializeArray();
var queryString = "";
for(var i = 0; i < dataArray.length; i++) {
    queryString += "&" + dataArray[i]["name"] + "+" + encodeURIComponent(dataArray[i]["value"]);
}
$.ajax({
    url:"url.htm",
    data:dataString,
    contentType:"application/x-www-form-urlencoded; charset=UTF-8",
    success:function(response) {
        // proccess response
    });
});

それは頭痛なしでうまく働きます。

よろしく、

24
Arthur Ronald

私は非常に似た問題を抱えていました。 Ajax呼び出しを行うには、JQueryを使用してURLパラメーターを渡す必要があり、ほとんどの場合、パラメーター値にはアクセントが含まれていました。

どちらのページもcharset = ISO-8859-1に設定する必要があり、javascriptの関数(encodeURI、encodeURIComponentなど)はUTF-8のみを使用します。

私がやったことは、元のページにリンクを作成することでした。エンコードを行わないすべてのパラメータを含めてみましょう。

var myLink = document.getElementById("myHiddenLink");
myLink.setAttribute("href", "México, Perú, María and any other words with accents and spaces");

次に、次のように、href値を変数に割り当てます。

var theLink = myLink.getAttribute("href");

したがって、最後に「theLink」変数値はISO-8859-1でエンコードされ、すべて正常に機能しました。

4
Sergio