「UTF-16」を含む日記 RSS

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

2018-12-24

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

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=unsigned charでええんかいな。という点です。

文字コードを少しでも知っている人は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をunsigned charの子クラスにしたとしてもそれって、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++界隈ではない自分は思うわけです。

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

2018-04-20

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

1. BMP外の文字を使う

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

2. CJK互換漢字を使う

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

3. 文字数を変える

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

2014-06-24

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

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

INSERT INTO TBL SELECT TBL.COL FROM OPENROWSET(BULK 'filepath', SINGLE_NCLOB) AS TBL(COL)

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

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

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

感謝

SQLSERVER:OPENROWSET SINGLE_NCBLOB は BOMつきで

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

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

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

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

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から名前空間無名関数サポートされた。

2010-05-24

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

 
ログイン ユーザー登録
ようこそ ゲスト さん