回答:
ブラウザとエディタがISO-8859-1 / Windows-1252ではなくUTF-8エンコーディングを使用していることを確認してください。
またはを使用します’
。
だから問題は何ですか、
これは、UTF-8ではなくCP-1252としてデコードされる’
(RIGHT SINGLE QUOTATION MARK
-U + 2019)文字です。あなたがチェックした場合のエンコーディングのテーブルを、あなたはこの文字がUTF-8でバイトで構成されていることがわかり、と。あなたがチェックするとCP-1252コード・ページのレイアウトを、あなたはそれらのバイトのそれぞれが個々の文字のために立っていることがわかります、と。0xE2
0x80
0x99
â
€
™
どうすれば修正できますか?
文字の読み取り、書き込み、保存、表示には、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フォーム送信値です。
問題について詳しく学ぶためのリンクをいくつか次に示します。
私はいくつかの書類持っている…
と示していた…
とê
として見せていたがê
。これはそこに到達した方法です(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)でも同じ問題が発生する可能性があります。
’
(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つの文字セット変換を受けます。
ソース’
文字(U+2019
)は最初にUTF-8バイトとしてエンコードされます。
0xE2 0x80 0x99
次に、これらの個々のバイトが誤って解釈されU+00E2 U+20AC U+2122
、Windows-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で追加の変換が実行されている場所を見つけて削除する必要があります。
これは、文字列がWindows-1252からUTF-8に2回変換されるときに発生することがあります。
これは、おそらくMySQL接続が正しい文字セットを指定していないために、データベースにそのような文字が表示されていたZend / PHP / MySQLアプリケーションにありました。私たちはしなければなりませんでした:
ZendとPHPがデータベースとUTF-8で通信していることを確認します(デフォルトではありません)。
このようないくつかの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 ’
文字エンコードに不一致があります。文字列は1つのエンコーディング(UTF-8)でエンコードされ、このページを解釈しているものはすべて別のもの(たとえばASCII)を使用しています。
常にhttpヘッダーでエンコードを指定し、これがフレームワークのエンコードの定義と一致していることを確認してください。
サンプルHTTPヘッダー:
Content-Type text/html; charset=utf-8
<configuration>
<system.web>
<globalization
fileEncoding="utf-8"
requestEncoding="utf-8"
responseEncoding="utf-8"
culture="en-US"
uiCulture="de-DE"
/>
</system.web>
</configuration>
WordPress Webサイトで誰かがこのエラーを受け取った場合は、wp-config db charsetを変更する必要があります。
define('DB_CHARSET', 'utf8mb4_unicode_ci');
の代わりに:
define('DB_CHARSET', 'utf8mb4');
DBeaver(または他のエディター)では、作業中のスクリプトファイルでUTF8として保存するように求めるメッセージが表示され、文字が変更されます。
–
に
–
または
–
Word文書からテキストをコピーして貼り付ける必要があります。Word文書はスマートクオートを使用します。特殊文字(&rsquo;)に置き換えるか、HTMLエディターに入力( ')することができます。
これはあなたの問題を解決すると確信しています。
同じことが「-」文字(長いマイナス記号)でも起こりました。
私はこの単純な置換を使用したので、それを解決します:
htmlText = htmlText.Replace('–', '-');