「’」が「 '」ではなくページに表示される


133

’の代わりに私のページに表示されています'

私が持っているContent-TypeにセットをUTF-8私の両方に<head>タグと私のHTTPヘッダ:

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

ここに画像の説明を入力してください

さらに、私のブラウザは次のように設定されていUnicode (UTF-8)ます。

ここに画像の説明を入力してください

では、何が問題なのか、そしてどうすれば修正できるのか?


回答:


55

ブラウザとエディタがISO-8859-1 / Windows-1252ではなくUTF-8エンコーディングを使用していることを確認してください。

またはを使用します&rsquo;


75
いいえ、解決していません。アプリケーションの文字エンコードにまだ矛盾があります。今後、CP1252以外の文字でも同じ問題が発生します。そして、それらはかなりたくさんあります...
BalusC '19 / 03/10

12
引き続き遭遇する文字の例:i18nqa.com/debug/utf8-debug.html
Zoot

utf-8エンコーディング+1
Karuhanga

217

だから問題は何ですか、

これは、UTF-8ではなくCP-1252としてデコードされるRIGHT SINGLE QUOTATION MARK-U + 2019)文字です。あなたがチェックした場合のエンコーディングのテーブルを、あなたはこの文字がUTF-8でバイトで構成されていることがわかり、と。あなたがチェックするとCP-1252コード・ページのレイアウトを、あなたはそれらのバイトのそれぞれが個々の文字のために立っていることがわかります、と。0xE20x800x99â


どうすれば修正できますか?

文字の読み取り、書き込み、保存、表示には、CP-1252の代わりにUTF-8を使用してください。


<head>タグとHTTPヘッダーの両方でContent-TypeをUTF-8に設定しています。

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

これは、文字の解釈と表示に使用するエンコーディングをクライアントに指示するだけです。これは、文字の読み取り、書き込み、保存、表示に使用するエンコーディングをプログラムに指示するものではありません。正確な答えは、使用するサーバー側のプラットフォーム/データベース/プログラミング言語によって異なります。HTTP応答ヘッダーで設定されたものは、HTMLメタタグよりも優先されることに注意してください。HTMLメタタグは、ページがHTTPではなくローカルディスクファイルシステムから開かれた場合にのみ使用されます。


さらに、私のブラウザは次のように設定されていUnicode (UTF-8)ます。

これは、クライアントが文字を解釈して表示するために使用するエンコーディングを強制するだけです。しかし、実際の問題は、’(UTF-8でエンコードされた)がの代わりにクライアントに送信されていることです。クライアントは’、UTF-8エンコーディングを使用して正しく表示されています。クライアントが誤って使用するように指示された場合(ISO-8859-1など)、ââ¬â¢代わりに表示されたはずです。


データベースでASP.NET 2.0を使用しています。

これは、問題が発生している可能性が高い場所です。独立したデータベースツールでデータがどのように見えるかを確認する必要があります。

文字がそこにある場合、データベースに正しく接続していません。データベースコネクタにUTF-8を使用するように指示する必要があります。

データベースにが含まれている場合、’めちゃくちゃになっているのはデータベースです。ほとんどの場合、テーブルはを使用するように設定されていませんUTF-8。代わりに、構成に応じて異なるデータベースのデフォルトのエンコーディングを使用します。これが問題である場合、通常はテーブルを変更してUTF-8を使用するだけで十分です。データベースがそれをサポートしていない場合は、テーブルを再作成する必要があります。テーブルを作成するときに、テーブルのエンコーディングを設定することをお勧めします。

SQL Serverを使用している可能性が高いですが、これがいくつかのMySQLコードです(この記事からのコピーです)。

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

ただし、テーブルがすでにUTF-8である場合は、一歩戻る必要があります。またはがそこにデータを置いたそれが問題です。1つの例は、誤ってエンコード/デコードされたHTMLフォーム送信値です。


問題について詳しく学ぶためのリンクをいくつか次に示します。


2
たとえばmysqlデータベースなどのどこかに保存されているこのような壊れたコンテンツがある場合、stackoverflow.com / a / 9407998/117647には、文字をutf-8に変換するために必要なトリックがあります
Steve

5
TL; DR; UTF-8を使用して、文字の読み取り、書き込み、保存、表示を行います。
c0degeas 2018年

iso-8859-1とWindows-1252のテーブルは重複しているため、いくつかの「奇妙な文字の組み合わせ」が両方に共通であることに注意してください(たとえば、「é」は「é」)。
Skippy le Grand Gourou

15

私はいくつかの書類持っていると示していた…êとして見せていたがê。これはそこに到達した方法です(Pythonコード):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

この問題を修正するために、私は次のようなpythonコードを使用しました。

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(誰かがきらめきバージョンを正しいUTF-8文書に挿入したため、私は実際にはきらめき部分のみを抽出し、それをデツインルし、再度挿入する必要がありました。このためにBeautifulSoupを使用しました。)

コンテンツ作成にチャーリーがいる可能性は、Webサーバーの構成が間違っているよりもはるかに高いです。また、utf-8ドキュメントに対してwindows-1252エンコーディングを選択することで、Webブラウザーに強制的にページをきらきらさせることもできます。ご使用のWebブラウザーは、チャーリーが保存した文書をデツインリングできません。

:windows-1252ではなく、他のシングルバイトコードページ(例:latin-1)でも同じ問題が発生する可能性があります。


14

(UnicodeコードポイントU+2019 RIGHT SINGLE QUOTATION MARK)は、バイトとしてUTF-8でエンコードされます。

0xE2 0x80 0x99

’(UnicodeコードポイントU+00E2 U+20AC U+2122)は、バイトとしてUTF-8でエンコードされます。

0xC3 0xA2   0xE2 0x82 0xAC   0xE2 0x84 0xA2

これらは、’UTF-8として処理されたときに生成するためにブラウザーが実際に受信しているバイトです。

つまり、ソースデータは、ブラウザーに送信される前に2つの文字セット変換を受けます。

  1. ソース文字(U+2019)は最初にUTF-8バイトとしてエンコードされます。

    0xE2 0x80 0x99

  2. 次に、これらの個々のバイトが誤って解釈されU+00E2 U+20AC U+2122Windows-125X文字セット(1252、1254、1256、および1258のすべてがにマップさ0xE2 0x80 0x99れるU+00E2 U+20AC U+2122)によってUnicodeコードポイントにデコードされ、それらのコードポイントがUTF-8バイトとしてエンコードされます。

    0xE2-> U+00E2-> 0xC3 0xA2
    0x80-> U+20AC-> 0xE2 0x82 0xAC
    0x99-> U+2122->0xE2 0x84 0xA2

手順2で追加の変換が実行されている場所を見つけて削除する必要があります。


12

これは、文字列がWindows-1252からUTF-8に2回変換されるときに発生することがあります。

これは、おそらくMySQL接続が正しい文字セットを指定していないために、データベースにそのような文字が表示されていたZend / PHP / MySQLアプリケーションにありました。私たちはしなければなりませんでした:

  1. ZendとPHPがデータベースとUTF-8で通信していることを確認します(デフォルトではありません)。

  2. このようないくつかのSQLクエリで壊れた文字を修復します...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    必要な数のテーブル/列に対してこれを行います。

必要に応じて、PHPでこれらの文字列の一部を修正することもできます。文字が符号化されているので注意することを二度、私たちが実際に逆変換を行う必要があるから、最初に私を混同のWindows-1252にUTF-8バックを。

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’

9

文字エンコードに不一致があります。文字列は1つのエンコーディング(UTF-8)でエンコードされ、このページを解釈しているものはすべて別のもの(たとえばASCII)を使用しています。

常にhttpヘッダーでエンコードを指定し、これがフレームワークのエンコードの定義と一致していることを確認してください。

サンプルHTTPヘッダー:

Content-Type    text/html; charset=utf-8

asp.netでのエンコーディングの設定

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

jspでのエンコーディングの設定


7

コンテンツタイプがすでにUTF8である場合、データがすでに間違ったエンコーディングで届いている可能性があります。データベースからデータを取得する場合は、データベース接続がUTF-8を使用していることを確認してください。

これがファイルのデータである場合は、ファイルがUTF-8として正しくエンコードされていることを確認してください。これは通常、選択したエディターの[名前を付けて保存]ダイアログで設定できます。

ソースファイルで表示したときにデータが既に壊れている場合は、以前はUTF-8ファイルでしたが、途中で間違ったエンコードで保存された可能性があります。


4

WordPress Webサイトで誰かがこのエラーを受け取った場合は、wp-config db charsetを変更する必要があります。

define('DB_CHARSET', 'utf8mb4_unicode_ci');

の代わりに:

define('DB_CHARSET', 'utf8mb4');

0

DBeaver(または他のエディター)では、作業中のスクリプトファイルでUTF8として保存するように求めるメッセージが表示され、文字が変更されます。

–

–

または

–

-1

Word文書からテキストをコピーして貼り付ける必要があります。Word文書はスマートクオートを使用します。特殊文字(&rsquo;)に置き換えるか、HTMLエディターに入力( ')することができます。

これはあなたの問題を解決すると確信しています。


-3

同じことが「-」文字(長いマイナス記号)でも起こりました。
私はこの単純な置換を使用したので、それを解決します:

htmlText = htmlText.Replace('–', '-');

4
OPの問題はmojibakeであり、類似のUnicode文字ではありません。
Cole Johnson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.