Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「UTF-16」を含む日記RSS

はてなキーワード:UTF-16とは

2025-10-09

Unicode符号位置からUTF-16サロゲートペア表現計算する

𩸽(ほっけ)のUnicode符号位置はU+29E3D。これをUTF-16で表すとする。

U+10000以上の符号位置文字UTF-16で表す場合サロゲートペアによって表現される。


まず、Unicode符号位置を表す「U+n」のnに対して、0x10000を減算する。

𩸽はU+29E3Dだから、0x10000を減算すると、nは0x19E3Dとなる。

(なお、Unicode符号位置が0x10000未満である場合は、それは16ビットであり(なぜなら0x10000未満であるとは、最大でも0xFFFFだから)、2バイト表現される。これはBMP範疇であり、サロゲートペア表現(BMP外の文字表現)の出番はない。)

(また、0x10000以下の符号位置のうち、Unicode符号位置U+D800~U+DFFFはサロゲートペア用に確保された符号位置領域であり、この領域内の一符号位置対応する文字は無い。)


0x19E3Dを、20桁の2進数変換すると、

$echo "obase=2; ibase=16; 19E3D" |bc11001111000111101↓(不足した桁をゼロで埋める)00011001111000111101

となる。



この20けた(00011001111000111101)のうち、

①上位10桁(0001100111)に対して0xD800(1101100000000000)を足す。これを上位サロゲートと呼ぶ。

1101100000000000      0001100111↓1101100001100111


②下位10桁(1000111101)に対して0xDC00(1101110000000000)を足す。これを下位サロゲートと呼ぶ。

11011100000000001000111101↓1101111000111101


③上位サロゲートと下位サロゲートの組み合わせ(1101100001100111 1101111000111101)が、UTF-16サロゲートペア表現のものである

$echo "obase=16; ibase=2; 11011000011001111101111000111101" |bcD867DE3D


求めた結果が正しいのか、unicodeコマンド確認する。

$unicode 𩸽UTF-16BE: d867de3d(※"BE"とはbig-endianの略であり、「この16進表現は左から上位バイトとして読みますよ」という意味)


Unicodeにおいて、本来文字は16bit、つまり65535文字で十分表現できるはずだった。

しか中国古代漢字などの文字も収録しようとすると、とても16bit程度では表現できないことが分かった。

そこで、UTF-16という符号方式においては、サロゲートペアという工夫を使うことで、10万以上の文字を扱えるように仕様を整えた。


正確にいうと、2byte(16bit)では65536文字表現できる。

ところで、0xD800~0xDFFF(2048の符号位置)はサロゲートペア用に確保されているため、特定文字符号位置としては利用できない。

その一方、サロゲートペアによって20bit分(1048576文字分)の符号位置を確保できたため、UTF-16では、

$echo $((65536-2048+1048576))1112064

111万文字ほど表現できる。

Permalink |記事への反応(0) | 00:14

このエントリーをはてなブックマークに追加ツイートシェア

2025-09-18

anond:20250918214731

惜しい

UTF-16LEまで言ってこそ一流の増田やで

Permalink |記事への反応(0) | 21:53

このエントリーをはてなブックマークに追加ツイートシェア

2024-09-18

文字コード開発した連中◯ねええええええええええええええええええええええええええええ

UTF-16LFという文字コードの変換がうまくいかなくて上司相談したところ

そもそも変換予定のファイルおかしくて、改めてもらったやつはshift-jisで数分で終わったあああああああああああああああ

そもそもなんでこんなに文字コードあるんだよおおおおおおおおおおおおおおおお

統一しろとか言わないから数減らせえええええええええええええええええええええええええええええええええええええええええ

Permalink |記事への反応(1) | 13:30

このエントリーをはてなブックマークに追加ツイートシェア

2024-06-16

日本語=2バイト文字の誤解はいつになったらなくなるのだろうか

Unicodeが普及してこれだけ経つのにいまだに日本語が2バイト文字という認識をしている人が世間に多くて驚いてしま

一般的世間で使われているUTF-8では日本語は3バイト以上になるのに、知識アップデートができていない人が多すぎる

そもそもUTF-16とかだとASCII文字も2バイトになるんだし、バイト数で文字種を区別すること自体無意味に思える

Permalink |記事への反応(1) | 21:40

このエントリーをはてなブックマークに追加ツイートシェア

2023-09-16

anond:20230916034813

GPTってCJK言語でもトークナイザ通してるのが意味分からんよなUTF-16コードポイントでええやろ

Permalink |記事への反応(1) | 04:04

このエントリーをはてなブックマークに追加ツイートシェア

2018-12-24

UTF8ってunsignedcharで良いんだっけ?問題

https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b]

から出発したこの話。あちこち議論されているようですな。

https://b.hatena.ne.jp/entry/s/qiita.com/yumetodo/items/54e1a8230dbf513ea85b]

https://togetter.com/li/1301253]

https://naruse.hateblo.jp/entry/2018/12/24/013446]

文字コードを多少かじった人間としては、また人類文字コードで混乱している。と思っていて議論が深まるのかなと思ったりします。

ただ、この話、見ててもやもやする所が一つありまして、UTF-8の1コードポイント=uint8_t=unsignedcharでええんかいな。という点です。

文字コードを少しでも知っている人はUTF-8は1つのコードポイントを可変長のバイト列で表します。

よく言われるようにASCIIは1バイト、大体のCJKV文字は3バイト以上で表します((久々にWikipediaUTF-8見たら、UTF-8サロゲートペアってあるんだねー。罪深いわOrale〜))。最大6バイトで1つのコードポイントを表します。

まりですね、char16_tとかchar32_tとかがUTF-16UTF-32マッピングされるのは分かるんですよ。サロゲートペアは脇に置いておいて、コードポイントを表すのにはこの型(っつーか、データ長)を使うよってのが分かるので。

サロゲートペアを考えたときのUTF16も同じ考え方になるんですけど、UTF-8みたいな可変長のバイト長を取るエンコード方式は、結局、1「文字」を表す型(データ長)が定まらないんですよ。

char8_tをunsignedcharの子クラスにしたとしてもそれって、UTF-8にとっては「1文字を表す型」ではないんですよ。「1文字を表すバイト列の単位の1つ」でしかないんですよ。(サロゲートペア考慮したときchar16_tも同様)。

意味論で言っちゃえばUTF-32に対してchar8_tを使っても意味は同じになるんですよ。UTF-32って8ビット×4で構成されるだけなんで。

なので、UTF-8で表される1文字を型で使いたかったらuint64_tの子クラス(本当は最大6バイトなので48でいいんだけど)にしなきゃダメなんじゃねぇの?もしくは最少8ビットで48ビット保証する型。とC++界隈ではない自分は思うわけです。

つーか、可変長文字って示すフラグになる型を作った方がまだマシじゃないのと思うのです。

Permalink |記事への反応(1) | 12:22

このエントリーをはてなブックマークに追加ツイートシェア

2018-04-20

新年号で出来る限りプログラマ嫌がらせする方法

1.BMP外の文字を使う

UTF-16ではサロゲートペアへの対応UTF-8では4バイト文字対応必要になる.

2. CJK互換漢字を使う

Unicode正規化で別の文字に変わるためその対応必要.

3.文字数を変える

例えば3文字にしたり4文字にしたりしてみる.

Permalink |記事への反応(0) | 12:29

このエントリーをはてなブックマークに追加ツイートシェア

2014-06-24

SQLSERVER テーブルのXML型の列へXMLファイルから取り込む一例

  1. XML宣言のエンコーディングを "utf-16" にする
  2. BOMつきのUTF-16(Unicode)でファイル保存する
  3. 次のようなSQL文を流す

INSERT INTOTBLSELECTTBL.COL FROM OPENROWSET(BULK 'filepath', SINGLE_NCLOB)ASTBL(COL)

他の方法もいろいろあるだろう。ただ、文字コードに関して言及すると、SQL SERVER の内部データUCS-2UTF-16のサブセット)なので、合わせておいたほうが無難UTF-16以外で取り込もうとすると、日本語付近で "XML 文字が無効です" などとエラーになる場合が多い(もちろん原因は何かあるのだろうが、調べてもさっぱり私には見当がつかない。時間の浪費はいやずら)。

'filepath'は、SQL SERVERインスタンスが動いているマシンにとってのファイルパスね。'E:\???\???.xml'や'\\filesvr01\shared\data\???.xml'とか。

SELECT COL.query('/ELEM/NODE') FROMTBL など、あとはいろいろクエリーしてみてくれ。

感謝

Permalink |記事への反応(0) | 17:17

このエントリーをはてなブックマークに追加ツイートシェア

SQLSERVER:OPENROWSET SINGLE_NCBLOB はBOMつきで

UNICODE (UTF-16)で保存しても、BOMをつけていないと

「SINGLE_NCLOB にはUNICODE (widechar)入力ファイル必要です。指定されたファイルUnicode ではありません。」

とはじかれる。ビッグエンディアンでもリトルエンディアンでもOK。

もちろん、UTF-8 ではBOMがあろうとなかろうとだめだ。

Permalink |記事への反応(0) | 17:04

このエントリーをはてなブックマークに追加ツイートシェア

2010-07-01

PHPの人がPHPの最新版を使ってなかった件

PHPユーザー会の中の人とたまたま話したんだけど、アプリケーションPHP5.2系からPHP5.3系への移行が滞っているようだ。

「業務でPHP5.3使ってますよー。」って言ったらむしろ驚かれた。どういうこった?

いま移行せずに、PHP5.3ってどうなるのよ?その先にあるPHP6系ってどうなるのよ?不安しかでてこない。

不満&不安
  1. サポート終了したPHP4系はまだレンタルサーバーにはびこっている。
  2. ライブラリPEARPHP4をサポートしつづけてるからヘボくなってきてる。
  3. 将来リリースされる予定のPHP6が不安
    1. 内部文字コードUTF-16の件でロールバック
      1. コアエンジニアの分担なので、ユーザーエンジニアには影響はそんなないけど。
  4. インタプリタが対話的にできない。
    1. 自作しろってことか??
  5. 5系より前からある関数のExceptionが整備されてない。catchでキャッチしにくい。
  6. 4系から入ったクラスのvarが5系のJavaっぽいオブジェクト指向文法によって不要になった点。
期待&満足
  1. 5.3から名前空間無名関数サポートされた。

Permalink |記事への反応(1) | 11:11

このエントリーをはてなブックマークに追加ツイートシェア

2010-05-24

全角半角厨はUTF-16サロゲートペアとか発狂するんだろうな

Permalink |記事への反応(0) | 20:56

このエントリーをはてなブックマークに追加ツイートシェア

 
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp