21

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

メッセージに次のようなá文字が含まれている場合、これらの文字は投稿されたメッセージに×として表示されます。ブラウザに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がメッセージ(または途中で何か)をどのようにエンコードしているかに実際にありました。次のスニペットに示すように、データを処理しないように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"
  });
}
4

2 に答える 2

24

Javascriptが文字列にUTF-8を使用していることは私の理解です

いいえ、いいえ。

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

<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...

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

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

または、各文字で使用される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
    });
});

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

よろしく、

于 2010-02-20T18:08:38.143 に答える