1

サーバーはPHP5で、HTML文字セットはlatin1(iso-8859-1)です。通常の形式のPOST要求では、たとえばemダッシュ(–)などの「特殊」文字に問題はありません。よくわかりませんが、動作します。おそらく、charコード150でブラウザに表現可能な文字が存在するためです(これは、サーバー上のPHPで文字通りのemダッシュを使用して表示されるものですord)。

これで、アプリケーションはajaxを介してある種のプレビューメカニズムも提供します。テキストがサーバーに送信され、プレビュー用の完全なHTMLが返送されます。ただし、ajax経由で送信された場合の通常の文字コード150 emダッシュ文字(GETおよびPOSTでテスト済み)は、さらに次のように変化します%E2%80%93。これはすでにapacheログに表示されています。

http://www.tachyonsoft.com/uc0020.htmなど、私が見つけたさまざまな情報源によると、これはem dashのUTF8バイト表現であり、現在の知識では、JavaScriptがすべてをUnicodeで処理します。

ただし、私のアプリ内では、latin1のすべてが必要です。簡単に言うと、通常のPOSTリクエストでそのemダッシュがcharコード150として与えられたのと同じように、翻訳されたUTF8表現にもそれが必要になります。

utf8_decode(...)サーバー上のPHPを使用して、どちらかまたは両方でデコードしようとすると、この文字を表すiconv('UTF-8', 'iso-8859-1', ...)通常の文字が表示されるため、失敗しました?(そして、iconvも通知をスローします:入力文字列で不正な文字が検出されました) 。

私の目標は自動化された解決策を見つけることですが、この場合、私は超賢くなりたいと思っていますか?

他の人が、事前定義された入力/出力セットに手動で置き換えるだけであることがわかりました。でもそれはいつも私がキャラクターを失うことができるという感覚を私に与えます。

注意深い読者は、私がUnicodeと文字の変換に関することの完全な影響/複雑さを理解するのに遅れていることに気付くでしょう、そして私は間違いなく全体として、そして単に手動のマッピングを理解することを好みます。

シングルバイト文字の必要性に関するDelandsの質問に基づいて更新します。

真実は、私はそれが必要かどうかわかりません。現在、サーバーにデータを渡して戻すには2つの方法があります。

  1. クライアントlatin1->通常のPOSTリクエスト->サーバー上のlatin1、latin1で完全なページを送り返します。文字はOKです。

  2. クライアントlatin1->ajaxリクエスト(取得または投稿)->latin1はutf8に変換されます->utf8をlatin1に変換し直そうとします->latin1HTMLフラグメントをクライアントに送信してインラインで表示します->特殊文字は失敗します

utf8-> latin1からの変換は、上記のutf8_decode / iconで説明したように機能しないため、2番目の方法は失敗します。

私の最終的な目標は、ユーザーが入力したデータのプレビューを表示することです。HTMLレンダリングやその他のデータ評価を行うには、サーバーのラウンドトリップが必要です。

ソリューション

アランの答えは解決策です。これは後ろのようにlatin1扱われwindows-1252、これはWord(少なくともここでは私の2007年)がブラウザとの間で何かをコピーして貼り付けるときに使用するようにも見えます。

さらに興味深いリンク(Alans wikipediaの記事から)は、HTML5構文へのリンクです。

8.2.2.2:ユーザーエージェントは、少なくともUTF-8およびWindows-1252エンコーディングをサポートする必要がありますが、それ以上をサポートする場合もあります。

..。

ユーザーエージェントが次の表の最初の列に示されているエンコーディングを使用してコンテンツをUnicode文字に変換するか、Unicode文字をバイトに変換する場合、代わりに同じ行の2番目の列のセルに示されているエンコーディングを使用する必要があります。 。このエンコーディングエイリアシングのためにバイトまたはバイトシーケンスが異なる方法で処理される場合、互換性のために誤って解釈されたと言われます。

..。

入力エンコーディング:ISO-8859-1- >置換エンコーディング:windows-1252

4

2 に答える 2

3

ISO-8859-1は、em-dash文字をサポートしていません。実際には、Microsoftの拡張コードページの1つ、おそらくwindows-1252を使用しています。これは事実上latin1のスーパーセットであるため、ブラウザはページがISO-8859-1として提供されるときにこれを使用する傾向があります(これが文字が正しく表示される理由です)。ただし、em-dashのような拡張文字を使用する場合は、可能な限り、文字セットとしてwindows-1252を指定する必要があります。または、さらに良いことに、どこでもUTF-8を指定します。

于 2010-05-06T10:22:05.117 に答える
1

UTF-8のしくみに関するガイド付きのページ:

http://azabani.com/15

https://en.wikipedia.org/wiki/UTF-8

簡単に言えば、ISO-8859-1(255コードポイントで制限)やUnicode(1400以上が使用される1114112コードポイントを所有)のような「拡張」ASCIIセットの簡単なマッピングはありません。シングルバイトの文字セットが必要な理由について詳しく教えてください; 多分私はあなたがこの制限を回避するのを手伝うことができます。UTF-8は、テキストをエンコードするための最も効率的で柔軟な選択肢であり、可能な限り使用する必要があります。

于 2010-05-05T10:35:08.227 に答える