2011-10-26 13 views
2

私は文字「ö」を持っています。 this UTF-8 tableを見ると、16進数の値がF6であることがわかります。 Unicode tableを見ると、 "ö"はインデックスがE016であることがわかります。両方を追加すると、コードポイントの16進数がF6になります。これはバイナリ値1111 0110です。文字をUTF-8からISO-8859-1に手動で変換します

1)F6からインデックスE016に移動するにはどうすればよいですか?私は結果を得ていなかったので
2)私は2バイトC3B6からF6から来たのか分からない...

は、私は他の道を行くことを試みました。 "ö"はISO-8859-1で "¶"と表現されています。 UTF-8 tableには、 "Ã"に小数点以下の値があり、195があり、 "¶"に小数点以下の桁があることがわかります。182です。ビットに変換されたのは1100 0011 1011 0110です。

プロセス:

  1. tableを見て、文字 "O" のUnicodeを取得します。 E016のインデックスから計算すると、Unicode U+00F6が得られます。

  2. wildplasserによってポスティングされたアルゴリズムによれば、コード化されたUTF-8値C3B6を計算できます。

  3. バイナリ形式では、195182の10進数値に対応する1100 0011 1011 0110が得られます。

  4. これらの値がISO 8859-1(1バイトのみ)と解釈された場合、「¶」となります。

PS:私はステップ2.

+0

両方向に変換しますか?ところで、あなたはutf8からiso9959-1に変換しません。形式utf8をコードポイントのバイナリ値に変換し、8ビットで表現します。このコードポイントはlatin1と解釈する必要はありません。 – wildplasser

+0

UTF-16を最初に使ったほうがはるかに簡単です。 UTF-8では、あなたはE0/16を持っています。これは、UTF-8アルゴリズムに従ってF6に変換されます。次に、位置F6にあるISO-8859-1テーブルでU + 00F6を検索します。 –

+0

@wildplasser: 私が一方向を知っていれば、他の人は問題ではないはずです。私は最初の試行では望みの結果を得られなかったので、もう一度試しました(反対方向)。いいえ、私は質問を編集し、コードポイントのバイナリ値を追加しました。しかし、今私はそれをLatin1でどのように解釈できますか? @RaymondChen: [これはISO-8859-1の表](http://htmlhelp.com/reference/charset/latin1.gif)です。しかし、私は現在、2バイトの「C3」と「B6」に来る方法を知らない。 – testing

答えて

7

あなたが使っているページがあなたを混乱させているewhat。 "UTF-8テーブル"または "Unicodeテーブル"のどちらも、UTF-8でのコードポイントの値を提供していません。それらは両方とも文字のUnicode値を単純にリストしています。

ユニコードでは、すべての文字(「コードポイント」)には一意の番号が割り当てられています。文字öには、コードポイントU+00F6が割り当てられています。コードポイントは、F6(16進数)、246(10進数)です。

UTF-8は、Unicodeコードポイントごとに1〜4バイトのシーケンスを使用して、Unicodeのrepresentationです。この記事では、32ビットのUnicodeコードポイントからUTF-8バイトシーケンスへの変換について説明します。使い慣れた方が簡単です。もちろん、コンピュータはいつもそれをやりますが、鉛筆や紙で簡単にやり、練習であなたの頭の中で行うことができます。

あなたがその変換を行う場合は、U+00F6はそれがöのUTF-8表現である理由であるUTF-8シーケンスC3 B6、またはバイナリで1100 0011 1011 0110に変換していることがわかります。

質問のもう半分はISO-8859-1についてです。これは、一般に "Latin-1"と呼ばれる文字エンコーディングです。 Latin-1エンコーディングの数値は、Unicodeの最初の256コードポイントと同じです。したがって、öは、Latin-1ではF6です。

UTF-8と標準のUnicodeコードポイント(UTF-32)の間で変換したら、Latin-1エンコーディングを取得するのは簡単です。ただし、すべてのUTF-8シーケンス/ Unicode文字に対応するLatin-1文字があるわけではありません。

文字エンコードとそれらの間の変換の詳細については、優秀な記事The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)を参照してください。

+0

ええ、私はエンコードを始める前に記事を読んでいます。私は薄い[このリンク](http://www.utf8-chartable.de/)は、コードポイントをUTF-8で非常によく示しています。 wildplasserのおかげで、私はUTF-8とUnicodeコードポイントの間で変換することができます。しかし、あなたはトピックの良い要約を送った!ありがとう! – testing

2
unsigned cha_latin2utf8(unsigned char *dst, unsigned cha) 
{ 
if (cha < 0x80) { *dst = cha; return 1; } 
    /* all 11 bit codepoints (0x0 -- 0x7ff) 
     ** fit within a 2byte utf8 char 
     ** firstbyte = 110 +xxxxx := 0xc0 + (char>>6) MSB 
     ** second = 10 +xxxxxx := 0x80 + (char& 63) LSB 
     */ 
    *dst++ = 0xc0 | (cha >>6) & 0x1f; /* 2+1+5 bits */ 
    *dst++ = 0x80 | (cha) & 0x3f; /* 1+1+6 bits */ 

return 2; /* number of bytes produced */ 
} 

からの値は、それをテストするために示しており、this linkも見出さ:

#include <stdio.h> 
int main (void) 
{ 
char buff[12]; 

cha_latin2utf8 (buff, 0xf6); 

fprintf(stdout, "%02x %02x\n" 
    , (unsigned) buff[0] & 0xff 
    , (unsigned) buff[1] & 0xff); 

return 0; 
} 

結果:

c3 b6 
+0

この擬似コードか実際の動作中のC++コードですか?答えをもっと詳しく説明でき、あなたの機能は何をしていますか?これはlatin1変換された(後の)文字と変換されるべき文字を入力として受け取ります。あなたが1バイト(ASCII)のサイズを持っているかどうかを見て、それを返します。 2バイトの場合はUTF-8の規則の後にMSBとLSBの2バイトを作成します。私の例ではMSB/LSBとは何ですか? OK私はそれを理解した。この関数は、入力(cha)として「F6」をとり、MSB「C3」およびLSB「B6」を作成する。だから私は他の方法でも計算することができます。 – testing

+0

はい、動作しているCコードです。これをテストするには、F6の値を 'cha'引数に差し込み、何が起こるかを確認してください。これはあなたの頭や紙の上で行うことができます。結果**はあなたのE0と16の値でなければなりません。 – wildplasser

+0

実際には(まだ)働いていませんでした。 – wildplasser

関連する問題