Sunday, May 19, 2024
Google search engine
HomeShare experienceオンラインカジノが選ぶフットボールのギャンブルとベットのスキル

オンラインカジノが選ぶフットボールのギャンブルとベットのスキル

コンピュータの初期の日々から始まる物語です。この物語は、プロットがあり、競争や興味があり、多くの国と言語を渡り歩きます。衝突と解決があり、幸せっぽい結末もあります。しかし、最も重要な焦点は、それらのキャラクターのうちの110,116人です。物語の終わりまでに、彼らはそれぞれがこの世界で独自の場所を見つけるでしょう。

この記事では、いくつかのキャラクターに焦点を当て、彼らがWebサーバーからブラウザに旅をする様子を追います。途中で、文字の歴史、文字セット、UnicodeとUTF-8、そしてなぜデータベースやテキストファイルには質問符や奇妙なアクセント記号が表示されることがあるのかについて詳しく説明します。

注意: この記事にはたくさんの数字が含まれており、朝のコーヒーを飲んだ後に取り組むことをおすすめします。

ASCII

コンピュータは文字ではなく数字でしか処理できないため、どの数字がどの文字を表すか、すべてのコンピュータが合意することが重要です。

たとえば、私のコンピュータがAに数字1を使用し、Bに数字2を使用し、Cに数字3を使用するとしましょう。あなたのコンピュータがAに数字0、Bに数字1を使用するとします。私があなたに「HELLO」というメッセージを送った場合、数字8、5、12、12、15がワイヤー上を飛び越えます。しかし、あなたにとって8はIを意味するため、あなたはIFMMPと受信して解読します。効果的にコミュニケーションするためには、文字をエンコードするための標準的な方法に合意する必要があります。

このため、1960年代にアメリカン・スタンダーズ・アソシエーションが、アメリカ標準情報交換コード(ASCII)と呼ばれる7ビットのエンコーディングを作成しました。このエンコーディングでは、HELLOは72、69、76、76、79であり、1001000 1000101 1001100 1001100 1001111としてデジタルで送信されます。7ビットを使用することで、0000000から1111111までの128の値を持つことができます。そのため、ASCIIにはすべての大文字と小文字のラテン文字、数字、一般的な句読点、スペース、タブ、およびその他の制御文字の十分なスペースがあります。1968年、アメリカ合衆国のリンドン・ジョンソン大統領が公式にASCIIの使用を義務付けました。

自分で試してみる

ASCIIテーブルはたくさんあり、128個の文字を表示または説明するものです。または、以下のCSS、HTML、Javascriptを使用して独自のテーブルを作成することもできます。ほとんどは表示をきれいにするためです。

p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}

for (var i=0; i<128; i++) document.writeln ((i%32?'':'

‘) + i + ‘: ‘ + String.fromCharCode (i) + ‘
‘);

これにより、次のようなテーブルが表示されます。

Do-It-Yourself Javascript ASCII table viewed in Firefox

この中で最も重要な部分は、JavascriptのString.fromCharCode関数です。これは数値を受け取り、文字に変換します。実際、以下の4つのHTMLとJavascriptの行はすべて同じ結果を表示します。すべての行はブラウザに文字番号72、69、76、76、79を表示します。

HELLO
HELLO document.write (“HELLO”);

document.write (String.fromCharCode (72,69,76,76,79));

また、Firefoxは最初の列に印字不可の文字(バックスペースやエスケープなど)を表示します。一部のブラウザはブランクや質問符を表示します。Firefoxは4桁の16進数を小さなボックスに詰め込みます。

8ビット目

テレタイプやステンシル式印刷機は、お互いに7ビットの情報を送信することに満足していました。しかし、1970年代の最新のマイクロプロセッサは2の累乗で動作することを好みました。1度に8ビットを処理できるため、1文字を保存するために8ビット(またはオクテット)を使用しました。これにより、256個の可能な値が得られます。

8ビットの文字は255までの数値を格納できますが、ASCIIでは127までの値しか割り当てられていません。128から255までのその他の値は余剰です。最初のIBM PCでは、余剰のスロットにアクセント付きの文字、さまざまな記号や形状、およびいくつかのギリシャ文字が割り当てられました。たとえば、番号200は枠の左下隅を表しました:╚、および224は小文字のギリシャ文字アルファ:αです。これらの文字のエンコード方法は、後にコードページ437という名前が付けられました。

しかし、ASCIIとは異なり、128-255の文字は標準化されませんでした。さまざまな国が余剰のスロットを独自のアルファベットに使用し始めました。224がαを表示するべきかどうか、ギリシャ人でさえも合意しませんでした。これにより、いくつかの新しいコードページが作成されました。たとえば、ロシアのIBMコンピュータでは、コードページ885を使用して、224はキリル文字のЯを表し、ギリシャのコードページ737では、小文字のオメガ:ωです。

その後も意見の相違は続きました。1980年代から、マイクロソフトのWindowsは独自のコードページを導入しました。キリル文字のコードページWindows-1251では、224はキリル文字のaを、Яは223で表示します。

1990年代後半、標準化の試みが行われました。さまざまなアルファベット(キリル、アラビア、ヘブライ、トルコ、タイなど)をカバーするために、15種類の8ビット文字セットが作成されました。これらはISO-8859-1からISO-8859-16まで(12番は廃止されました)。キリルのISO-8859-5では、224は文字рを表示し、Яは207です。

したがって、ロシア人の友人が文書を送ってきた場合、どのコードページを使用しているかを確認する必要があります。文書自体は単なる数字のシーケンスです。キャラクター224はЯaまたはрのいずれかになります。誤ったコードページで表示すると、文字がバラバラに見えます(Webページを表示する場合は、Webブラウザがページの文字セットを頻度分析などの技術に基づいて検出できるため、安心してください。ただし、これは誤ったセキュリティ感覚です-時々間違えることがあります)。

自分で試してみる

コードページは文字セットとも呼ばれます。これらの文字セットを自分で探索することができますが、この場合はPHPまたは類似のサーバーサイド言語を使用する必要があります(文字はブラウザに到達する前にページ内に含まれる必要があるため、おおよそです)。以下の行をPHPファイルに保存し、サーバーにアップロードします。

p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}

<?php for ($i=0; $i<256; $i++) echo ($i%32?'':'

‘) . $i . ‘: ‘ . chr ($i) . ‘
‘; ?>

これにより、次のようなテーブルが表示されます。

Cyrillic character set ISO-8859-5 viewed in Firefox

PHPのchr関数は、JavascriptのString.fromCharCodeと同様のことをします。たとえば、chr(224)は数字224をWebページに埋め込み、ブラウザに送信する前にそれを文字に変換します。先に述べたように、224はさまざまなものを意味することがあります。したがって、ブラウザは224を表示するためにどの文字セットを使用するかを知る必要があります。上記の最初の行がそれに使われます。これはブラウザに、「Cyrillic character set ISO-8858-5を使用するように」と伝えるためのものです。

charsetの行を除外すると、ブラウザはデフォルトの文字セットを使用して表示します。ラテン文字ベースのアルファベット(イギリスやアメリカなど)の国では、おそらくISO-8859-1です。この場合、224は重アクセント付きのa: àになります。この行をISO-8859-7やWindows-1251に変更してページを再読み込みしてみてください。ブラウザでも文字セットをオーバーライドすることができます。Firefoxでビュー->文字エンコーディングに移動して、いくつかを切り替えて効果を確認します。256文字以上表示しようとすると、シーケンスが繰り返されます。

1990年頃のまとめ

これが1990年頃の状況です。多くの言語で書かれた文書を作成、保存、交換することができますが、どの文字セットを使用しているかを知る必要があります。また、同じ文書で2つ以上の非英語のアルファベットを使用する簡単な方法はなく、256文字を超えるような漢字や日本語のアルファベットは、完全に異なるシステムを使用する必要があります。

最後に、インターネットの時代がやってきました!国際化とグローバル化により、これはさらに大きな問題となりました。新しい標準が必要とされています。

Unicode の救世主

1980年代後半から、すべての言語のすべての文字に固有の番号(公式にはコードポイントと呼ばれる)を割り当てる新しい標準が提案されました。この標準はUnicodeと呼ばれ、バージョン6.1になっており、110,000以上のコードポイントから構成されています。すべてのコードポイントを眺めるには数時間かかります。

最初の128のUnicodeコードポイントはASCIIと同じです。128-255の範囲には通貨記号やその他の一般的な記号、アクセント記号付きの文字(ダイアクリティカルマーク付きの文字)が含まれており、ISO-8859-1から借用された部分も多いです。256以降はさまざまなアクセント記号が含まれています。880以降はギリシャ文字、その後キリル文字、ヘブライ文字、アラビア文字、インドの書記体、タイ文字などが続きます。中国語、日本語、韓国語は11904から始まり、その間に他の多くの文字があります。

これは素晴らしいです – これ以上の曖昧さはありません – それぞれの文字は独自の番号で表されます。キリル文字のЯは常に1071であり、ギリシャ文字のαは常に945です。224は常にàであり、Hはまだ72です。これらのUnicodeコードポイントは、公式には16進数で書かれ、U+の前に記述されます。したがって、UnicodeコードポイントHは通常、72の代わりにU+0048と書かれます(16進数から10進数に変換するには、4 * 16 + 8 = 72)。

最大の問題は、256個以上のコードポイントがあることです。文字は8ビットに収まりません。ただし、Unicodeは文字セットまたはコードページではありません。したがって、公式にはUnicodeコンソーシアムの問題ではありません。彼らはアイデアを提案しただけで、実装を整理するのは他の誰かの仕事です。次の2つのセクションでその実装について詳しく説明します。

ブラウザ内のUnicode

Unicodeは8ビットには収まりません。たとえ110,116のコードポイントしか使用されていなくても、1,114,112のコードポイントを定義することができる能力を持っています。これには21ビットが必要です。

ただし、コンピュータは1970年代から進化しています。8ビットマイクロプロセッサはやや時代遅れです。新しいコンピュータには64ビットプロセッサが搭載されています。なので、なぜ8ビット文字以上の文字に移行して、32ビットまたは64ビット文字にしないのでしょうか?

その答えは、できるからです

CやC++で書かれた多くのソフトウェアは、「ワイドキャラクタ」と呼ばれるものをサポートしています。これは32ビットの文字、すなわちwchar_tです。これはCの8ビットchar型の拡張です。内部的には、モダンなWebブラウザはこれらのワイドキャラクタ(またはそれに類似したもの)を使用し、理論的には40億以上の異なる文字に対応できる能力を持っています。これはUnicodeに十分すぎます。そのため、モダンなWebブラウザは内部的にはUnicodeを使用します

自分で試してみる

以下のJavascriptコードはASCIIコードと似ていますが、はるかに高い数値までカウントアップします。各数値に対して、ブラウザに対して対応するUnicodeコードポイントを表示するよう指示します。

p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}

for (var i=0; i<2096; i++) document.writeln ((i%256?'':'

‘) + i + ‘: ‘ + String.fromCharCode (i) + ‘
‘);

これにより、次のようなテーブルが出力されます。

A selection of Unicode code points viewed in Firefox

上記のスクリーンショットは、Javascriptによって出力される最初の数千のコードポイントのサブセットを表示しています。選択肢にはいくつかのキリル文字とアラビア文字が含まれており、右から左に表示されています。

重要なポイントは、Javascriptコードは完全にWebブラウザで実行される点です。32ビット文字はWebブラウザで完全に受け入れられるので特に問題ありません。Javascriptの関数String.fromCharCode(1071)はUnicodeコードポイント1071を出力し、これは文字Яです。

同様に、HTMLエンティティЯをHTMLページに入れると、モダンなWebブラウザはЯを表示します。数値HTMLエンティティもUnicodeを参照しています。

一方、PHPの関数chr(1071)は/を出力します。なぜなら、chr関数は256以下の8ビットの数値しか処理せず、256を超えると繰り返しになるためです。1071%256=47であり、これは1960年代以来の/です。

UTF-8 の救世主

では、ブラウザは既に32ビット文字でUnicodeを扱えるので、何が問題なのでしょうか? 問題は、文字を送受信し、読み書きする際に発生します

この問題は以下の理由により引き続き発生します。

  1. 既存のソフトウェアとプロトコルが8ビットの文字を送受信し、読み書きする
  2. 32ビットを使用して英語のテキストを送信/保存すると、必要な帯域幅/スペースが4倍になる

ブラウザは内部的にはUnicodeを扱えますが、Webサーバーからデータをブラウザに送信し、それをデータベースやファイルに保存する必要があります。そのため、110,000以上のUnicodeのコードポイントをわずか8ビットに収める方法が必要です。

UCS2やUTF-16など、この問題を解決するためのいくつかの試みが行われてきましたが、最近の勝者はUTF-8です。UTF-8は、Universal Character Set Transformation Format 8 bitの略称で、非常に賢い方法です。キーボードのShiftキーのように機能します。通常、キーボードのHを押すと小文字の「h」が表示されますが、Shiftを押してから押すと大文字の「H」が表示されます。

UTF-8は、数値0〜127をASCIIと同じように扱い、192〜247をShiftキーとして、128〜192をシフト対象のキーとして扱います。たとえば、文字208と209は、それぞれキリル範囲に切り替えていることを示しています。208の後に175が続く場合、それは文字1071、キリル文字のЯです。正確な計算は、(208%32)*64 + (175%64) = 1071です。文字224〜239はダブルシフトのようなものです。226の後に190、そして128が続く場合、それは文字12160: ⾀です。240以上はトリプルシフトです。

したがって、UTF-8は、マルチバイトの可変幅エンコーディングです。マルチバイトとは、1文字(Яのようなもの)を指定するために複数のバイトが必要なことを意味します。可変幅とは、Hのような一部の文字は1バイトしか必要とせず、最大で4バイト必要なものもあることを意味します。

さらに、UTF-8はASCIIと後方互換性があります。他のいくつかの提案されたソリューションとは異なり、ASCIIでのみ書かれたドキュメントは、ASCIIとしてのみ妥当であり、帯域幅と手間を節約します。

自分で試してみる

次のPHPおよびJavascriptのコードを使用して、これらの問題について自分で試してみることができます。テキストの入力および出力に使用する文字セットを指定できます。ブラウザがそれについてどのように考えているかも見ることができます。

<?php
$charset = $_POST['charset'];
if (!$charset) $charset = 'ISO-8859-1';
$string = $_POST['string'];
if ($string) {
  echo '<p>This is what PHP thinks you entered:<br>';
  for ($i=0; $i<strlen($string); $i++) {
    $c = substr($string, $i, 1);
    echo ord($c) . ': ' . $c . '<br>';
  }
}
?>
<html>
<head>
<meta charset="<?= $charset ?>">
</head>
<body>
<form method="post">
<input name="lastcharset" type="hidden" value="<?= $charset ?>"/>
Form was submitted as: <?= $_POST['lastcharset'] ?><br/>
Text is displayed as: <?= $charset ?><br/>
Text will be submitted as: <?= $charset ?><br/>
Copy and paste or type here: <input name="string" type="text" size="20" value="<?= $string ?>"/><br/>
Next page will display as: <select name="charset"><option>ISO-8859-1<option>ISO-8859-5 <option>Windows-1251<option>ISO-8859-7<option>UTF-8</select><br/>
<input type="submit" value="Submit" onclick="ShowCharacters (this.form.string.value); return 1;"/>
</form>
<script type="text/javascript">
function ShowCharacters (s) {
  var r = 'You entered:';
  for (var i=0; i<s.length; i++) {
    r += 'n' + s.charCodeAt(i) + ': ' + s.substr(i, 1);
  }
  alert (r);
}
</script>
</body>
</html>

このコードの例では、最初の数値は文字の数値と、その文字を現在の文字セットで描画した場合の表現(個別に表示された場合)です。

上記のスクリーンショットは、入力と出力に異なる文字セットを使用する例を示しています。Google Chromeでは、£記号が�に変換される様子も見ることができます。

このページは、以前の文字セット、現在の文字セット、および将来の文字セットを表示しています。これらのコードを使用して、テキストが本当に乱れることがどれほどあるかを簡単に確認できるようになりました。たとえば、上記の「Submit」ボタンをもう一度押すと、�が表示されます。�は、Unicodeコードポイント65533で、UTF-8の239/191/189として表され、ISO-8859-1では�50と表示されます。したがって、£記号が�に変わることがある場合は、このルートをたどった可能性があります。

下のセレクトボックスは、毎回ISO-8859-1に変更されます。

1つの解決策

上記のエンコードの問題は、テキストが1つの文字セットで送信され、別の文字セットで表示されることによって引き起こされます。解決策は、ウェブサイトのすべてのページでUTF-8文字セットを使用することです。これを実現するためには、次のいずれかの行をタグの直後に記述する必要があります。

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

ウェブページの中での初期の場所になるように、なるべく早くこの変更を行う必要があります。

MySQLのテーブルでもUTF-8を指定することができますが、この機能を完全に活用するには、さらに深く掘り下げる必要があります。

また、ユーザーはブラウザで文字セットを上書きすることもできます。これはまれですが、このソリューションが確実に機能するわけではありません。追加のセキュリティを確保するために、データが正しい形式で到着していることを確認するためのバックエンドのチェックを実装することもできます。

既存のWebサイトの場合、さまざまな言語でテキストを収集してきた場合、既存のデータをUTF-8に変換する必要があります。データが少量の場合は、PHPページのようなものを使用して元の文字セットを特定し、ブラウザを使用してデータをUTF-8に変換することができます。

さまざまな文字セットで大量のデータがある場合は、まず文字セットを検出し、それを変換する必要があります。PHPでは、mb_detect_encodingを使用して検出し、iconvを使用して変換することができます。mb_detect_encodingのコメントを読むと、かなり厳密な関数のように見えますので、正しい結果を得るためには正しく使用しているかを確認するために実験を行う必要があります。

utf8_decodeという関数もありますが、その名前は誤解を招く可能性があります。UTF-8をISO-8859-1に変換します。ISO-8859-1に存在しない文字(キリル文字、ギリシャ文字、タ

RELATED ARTICLES
- Advertisment -
Google search engine

Most Popular

Recent Comments