[3] [DFN[[[UTF-1]]]] ([DFN[UCS Transformation Format One]]) は、 [[ISO/IEC 10646]]
の[[符号化方式]]の一種です。

* 特徴

[4] [[ISO/IEC2022]] の CL, SP, DEL, CR の符号位置の意味を変えない
ってのが売りだったらしい。

[18] 
[[ISO/IEC 10646-1:1993]] の附属書 G に載ってた。
だけどすぐに、 ISO/IEC 10646 からは削除されちまった。

もう誰にも相手してもらえない。かわいそうに。

[[UCS-4]] の文字を1〜5オクテットの可変長で表現。
[[UTF-8]] が1〜6オクテットなのに比べると、少し短くなるんだ。

割算を使うのが嫌われたらしい。
それから、 ASCII 非互換 (下記参照) なのとか、
[[UTF-8]] とは違って途中から文字区切りを探せないとか。


* エスケープシーケンス

[6] 
[[ISO-IR]] の登録番号は 178。登録簿には UTF-1 の仕様が載ってます。

- [10] <http://www.itscj.ipsj.or.jp/ISO-IR/178.pdf>
-- 消滅確認 [TIME[2022-05-09T09:40:31.200Z]]
-- [11] [CITE[00000001.PDF - 178.pdf]], [TIME[2021-05-21T08:10:48.000Z]], [TIME[2022-05-09T09:40:02.953Z]] <https://www.itscj-ipsj.jp/ir/178.pdf>



[9] 
ESC 2/5 4/2 (%B)

[12] 
[TIME[1993-01-21]]登録、
[TIME[1995-06-08]]改正 [SRC[>>11]]


[19] 
[[標準復帰]] [CODE(charname)@en[ESC]] [CODE[U+0025]] [CODE[U+0040]]
で
[[ISO/IEC 2022]] に切り替えることができます。

[SEE[ [[ISO/IEC 10646におけるエスケープシーケンス]] ]]

* ASCII の上位互換なの?

[[ASCII]] の文書はそのまま UTF-1 に持ってこれるけど、
[[シフトJIS]] みたいに2オクテット目以降に
0x00-7F のどれかが来るって意味では、 ASCII 互換じゃない。
(これはイタいね。)

* 文脈

[8] [[RFC 1505]] が使っていました。

[REFS[
- [13] [CITE@en[[[RFC 1505]] - Encoding Header Field for Internet Messages]], [TIME[2022-05-09T09:43:09.000Z]] <https://datatracker.ietf.org/doc/html/rfc1505.txt#section-3.1>
]REFS]


* UTF-1 の正規表現 (手抜き)

[PRE[
 qr/[\x00-\x9F]|[\xA0-\xF5].|[\xF6-\xFB]..|[\xFC-\xFF]..../
]PRE]

* IANA charset

[17] [[IANA登録簿]]の名前: 
[DFN[[CODE[ISO-10646-UTF-1]]]], 
[DFN[[CODE[csISO10646UTF1]]]]


* Perl 実装

[7] 
そもそも UTF-1 の実装なんて見たことないんですが(笑)、
面白そうだし 
[[RFC 1505]] の追悼(謎)の意をこめて、
作ってみました。

** UCS-4 → UTF-1

[PRE[
 sub u4code2u1code ($) {
   my $U = shift;
   return ($U) if $U <= 0x9F;
   return (0xA0, $U) if $U <= 0xFF;
   return (0xA1 + ( $U - 0x100 ) / 0xBE,
           T(     ( $U - 0x100 ) % 0xBE)) if $U <= 0x4015;
   return (0xF6 + ( $U - 0x4016 ) / ( 0xBE**2 ),
           T(     ( $U - 0x4016 ) / 0xBE % 0xBE),
           T(     ( $U - 0x4016 ) % 0xBE      )) if $U <= 0x38E2D;
   return (0xFC + ( $U - 0x38E2E ) / ( 0xBE**4 ),
           T(     ( $U - 0x38E2E ) / ( 0xBE**3 ) % 0xBE),
           T(     ( $U - 0x38E2E ) / ( 0xBE**2 ) % 0xBE),
           T(     ( $U - 0x38E2E ) /   0xBE      % 0xBE),
           T(     ( $U - 0x38E2E ) %   0xBE      ));
 }
]PRE]

[PRE[
 sub utf1code2ucs4code (@) {
   my ($x, $y, $z, $v, $w) = @_;
   return $x if @_ == 1 && $x <= 0x9F;
   return $y if $x == 0xA0;
   return ($x - 0xA1) * 0xBE + U($y) + 0x100
     if 0xA1 <= $x && $x <= 0xF5;
   return ($x - 0xF6) * ( 0xBE**2 ) + U($y) * 0xBE + U($z) + 0x4016
     if 0xF6 <= $x && $x <= 0xFB;
   return ($x - 0xFC) * ( 0xBE**4 ) + U($y) * ( 0xBE**3 )
              + U($z) * ( 0xBE**2 ) + U($v) * 0xBE
              + U($w) + 0x38E2E;
 }
]PRE]

[PRE[
 sub T ($) {
   my $z = shift;
   return $z + 0x21 if $z <= 0x5D;
   return $z + 0x42 if $z <= 0xBD;
   return $z - 0xBE if $z <= 0xDE;
   return $z - 0x60;
 }
]PRE]

[PRE[
 ## T(z) の逆関数
 sub U ($) {
   my $z = shift;
   return $z + 0xBE if $z <= 0x20;
   return $z - 0x21 if $z <= 0x7E;
   return $z + 0x60 if $z <= 0x9F;
   return $z - 0x42;
 }
]PRE]


[15] 
perl 5.8 とかの、 Encode module が動く perl でないと駄目です。

[14] 
Encode::Unicode::UTF1
<https://suika.suikawiki.org/gate/cvs/perl/lib/Encode/Unicode/UTF1.pm>

* 廃止

[20] 
[TIME[1996-10-15]]に発行された
[[ISO/IEC 10646-1:1993]]/Amd.4:1996
で削除されました。

;; [21] [[Korean mess]] より前なので、 [[Unicode 1.1]] 相当の時代だけで終わりました。
現行の [[Unicode]] で使われたことは(仕様上は)ありませんでした。


* 関連

[2] 昔の資料だと単に ''UTF'' と書かれていることもある。まさか今のように数多の [[UTF]] が登場するとは思ってもいなかったでしょうな。 ([[Unicode]] は既に UTF しか存在しないし。藁)

[5] [[UTF-8]] は当初は [[UTF-1]] とは別の [[UTF]] という意味で [[UTF-2]] とも呼ばれていました。

* メモ

[1] [[ビット組合せ]]についての ISO/IEC 2022 との親和性もあって、 [[IETF]] はメイル規格とかに採用する案もあったらしいが・・・。丸ごとぽしゃった。

[16] 
[[RFC 1505]] のことかな? それとも他にもあったのかな?


[22] [CITE@en[draft-ullmann-net-utf-00]], [TIME[2023-07-16T12:54:37.000Z]] <https://datatracker.ietf.org/doc/html/draft-ullmann-net-utf-00>

[23] >>22 [[DIS 10646-1.2]] 時代の Annex F (G でなくて) を引いていますが、
後の [[UTF-1]] と同じものでしょうか?
