[5] [[GB 2312]] (と ASCII) で書かれた文字列の[[符号化方式]]です。
7ビットで、 ASCII の印字可能図形文字の範囲で中文文字を表現出来ます。
8ビット目や CL の制御文字を落とす通信路を通っても安心です。

Fung Fung Lee によって考案されました。
その定義は後に RFC 1843 『HZ - A Data Format for Exchanging 
Files of Arbitrarily Mixed Chinese and ASCII characters』として
まとめられています。

更に、RFC 1842 『ASCII Printable Characters-Based 
Chinese Character Encoding for Internet Messages』で再定義されています。

[16] かつては[[中国大陸]]の[[電子メール]]や一部の [[Webページ]]で用いられていましたが、
現在は [[GB 18030]] や [[Unicode]] に移行しており、過去の文書を読み書きする必要がある特殊な場合を除き、
対応する必要はないと考えられています。

[17] [[Web]] における[[文字コード]]を規定する [[Encoding Standard]]
からも2014年11月に削除されています [SRC[>>11]]。

* 仕様書

[REFS[
- [12] [CITE@en[RFC 1842 - ASCII Printable Characters-Based Chinese Character Encoding for Internet Messages]] ([TIME[2014-10-12 06:30:17 +09:00]] 版) <http://tools.ietf.org/html/rfc1842>
- [13] [CITE@en[RFC 1843 - HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and ASCII characters]] ([TIME[2014-09-07 06:30:01 +09:00]] 版) <http://tools.ietf.org/html/rfc1843>
]REFS]

[14] [[Encoding Standard]] により近代的な定義がありましたが、削除されています (>>11)。

* 構造

ASCII の "~" (0x7E; TILDE) をエスケープ文字に使います。

,~{	,GB 2312 HZ モードへ
,~}	,HZ モードから ASCII モードへ
,~~	,"ASCII TILDE (\"~\"; 0x7E)"
,"~\\n"	,ASCII モード中で、行継続 ([[軟改行]])
,~[!-z|]	,将来の HZ モード文字集合に予約

RFC 1842, 1843 を読むと、 "~{" は ASCII モードにおいて
GB 2312 HZ モードへ移行し、 "~}" は GB 2312 HZ モードにおいて
ASCII モードに移行するとされてます。また、 GB 2312 文字列は
"~{" と "~}" で囲まれる、とされてます。

ですから、 [[ISO-2022-JP]] とは違って、 aiueo~}abcde
とか ~{123456~{567891~} は不正だと思われます。


* BNF

;; RFC 1842 より。 RFC 822 メッセージでの使用を想定しているので、
こういうことになってます。

[PRE[
   message             = headers 1*( CRLF *single-byte-char *segment
                         single-byte-seq *single-byte-char )
                                       ; see also [MIME1] "body-part"
                                       ; note: must end in ASCII
]PRE]

= headers             = <see [RFC822] "fields" and [MIME1] "body-part">
= segment             = single-byte-segment / double-byte-segment
= single-byte-segment = 1*single-byte-char
= double-byte-segment = double-byte-seq 1*( one-of-94 one-of-94 )
= single-byte-seq     = "~}"
= double-byte-seq     = "~{"
= CRLF                = CR LF
= ; ( Octal, Decimal.)
= CR                  = <ASCII CR, carriage return>; (    15,      13.)
= LF                  = <ASCII LF, linefeed>       ; (    12,      10.)
= one-of-94           = <any one of 94 values>     ; (41-176, 33.-126.)

[PRE[
   single-byte-char    = <any 7BIT, including bare CR & bare LF, but NOT
                          including CRLF, not including > / "~~">;
]PRE]

= 7BIT                = <any 7-bit value>          ; ( 0-177,  0.-127.)

single-byte-char がなんかおかしいですし、 ~\n が定義に現れてません。

ASCII "~{" GB ASCII "~}" ASCII みたいのでもいいことになってしまいますが、明らかにおかしいです。

GB 2312 の文字の部分が one-of-94 one-of-94 ですから、たとえば
"~{" という74区の文字も OK になってしまいます。

GB 2312 文字がない行でも ~} が1つ要るように見えますが、
これは RFC 1468 ([[ISO-2022-JP]]) などにもある不具合です。

現代風に再定義してみましょう。

= hz = *(hz-line CRLF) hz-line
= hz-line = *segment
= segment = ascii / gb2312 / special
= ascii = %x00-09 / %x0B-0C / %x0E-7D / %x7F
= gb2312 = "~{" 1*double-byte-char "~}"
= double-byte-char = %x21-7D %x21-7E
= special = tilde / soft-linebreak / reserved-sequence
= tilde = "~~"
= soft-linebreak = "~" CRLF
= reserved-sequence = "~" ( %x21-7A / %x7C )

GB 2312 では94区に文字は定義されていませんから、
94区の文字をどう扱うかは規定されていません。

soft-linebreak は、 RFC 1843 では 0x0A とされていますが、
RFC 1842 は RFC 822 で使うことを想定しているので 0x0D 0x0A
です。その辺は、改行コード問題を引き摺らざるをえないってことです。


* エラー処理

[1] "~{" で GB 2312 mode になったまま改行で、次の行から
(そこまで "~}" なしで) ASCII に戻る文書が少なからず
あるみたいです。復号する実装は option で行頭において
ASCII に戻るように出来るのが良いでしょう。

[2] >>1 GB mode で制御文字が使えるのかどうか、怪しい BNF
的には使えないみたいで、その他の部分でも使えるとは一言も
言ってませんから、行頭で必ず ASCII に戻してしまっても
いいかもしれません。


* 例

[PRE[
   Example 1:  (Suppose there is no line size limit.)
               This sentence is in ASCII.
               The next sentence is in GB.~{<:Ky2;S{#,NpJ)l6HK!#~}Bye.
]PRE]

[PRE[
   Example 2:  (Suppose the maximum line size is 42.)
               This sentence is in ASCII.
               The next sentence is in GB.~{<:Ky2;S{#,~}~
               ~{NpJ)l6HK!#~}Bye.
]PRE]

[PRE[
   Example 3:  (Suppose a new line is started for every mode switch.)
               This sentence is in ASCII.
               The next sentence is in GB.~
               ~{<:Ky2;S{#,NpJ)l6HK!#~}~
               Bye.
]PRE]


* 名前と実装


** [[MIME]] charset

[[charset]] 名 "HZ-GB-2312" が RFC 1842 で定義されています。


** Perl Encode モジュール

[6] Encode::CN::HZ で "hz" に対応しています。

- [7] 2002-10-13 (Sun) 19:25:14 ''[[名無しさん]]'' : [[Encode::HZ]] は HZ の変種にも対応。

** メモ

[28] [[HZ-GB-23121]] も参照。

* HZ8

[15] [[GB 2312]] 部分で[[右半面]]を使う [[HZ8]] もあります。

HZ8, 8bits HZ。 [[HZ]] のうち、 GB 2312 の部分の8ビット目
を立たせたもの。

[[EUC-CN]] 対応ソフトウェアでも見れるし、8ビット目が
落ちても HZ (7ビット) として解釈すれば復元出来る、
てなことで出来たんだと思われ。

それなりに使われていたらしいけど、今一知名度が無いね。

cnd.org の Wei Lin が考案したそうです。


[29] 
[CITE@en[compact_enc_det/util/encodings/encodings.pb.h at master · google/compact_enc_det · GitHub]], [TIME[2025-05-20T15:12:33.000Z]] <https://github.com/google/compact_enc_det/blob/master/util/encodings/encodings.pb.h#L144>

>
[PRE[
  // Some Web pages allow a mixture of HZ-GB and GB-2312 by using
  // ~{ ... ~} for 2-byte pairs, and the browsers support this.
]PRE]

* HZ-2

[21] [[Big5]] に対応させる拡張の1つ。 

[20] [CITE@ja[Proposed HZ-like 7-bit rendition of Big-5 character set]], [TIME[2023-07-31T07:10:08.000Z]] <https://groups.google.com/g/alt.chinese.computing/c/-4VvAfZWqBg/m/FZHZl4uFDY4J>

[24] 実装例、利用例があるのかは不明。


* HZ+

[22] [[Big5]] に対応させる拡張の1つ。 

[23] [[HZ-2]] と [[HZ+]] は別。

[19] 
[CITE[East Asian Character Sets Overview: Chinese]], [TIME[2023-07-30T02:30:42.000Z]], [TIME[2009-01-06T16:28:41.319Z]] <https://web.archive.org/web/20090106155444/http://www.massangeana.com/mas/charsets/cjk-c.htm>

[25] 利用例は見たことがない [SRC[>>19]] とのこと。

* メモ

- [3] 2002-10-19 (土) 13:30 ''[[名無しさん]]'': 考案者である[[李くん]]の Web site は <http://umunhum.stanford.edu/~lee/chicomp/>
- [4] 2002-10-19 (土) 14:06 ''[[名無しさん]]'': EHZ <http://umunhum.stanford.edu/~lee/chicomp/EHZ-CNS-BIG5_spec.html>

[26] 
[CITE[Mosaic-L10N: Changes]], [TIME[2017-09-14T23:06:30.000Z]], [TIME[2024-08-16T07:47:05.422Z]] <http://takadat.com/i/Mosaic-l10n/changes.html>

[27] 
[CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-23 23:21:54 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4281&to=4282>


[8] [CITE@en[Re: Encoding Standard at F2F]]
( ([[신정식]] 著, [TIME[2012-11-04 04:20:25 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-international/2012OctDec/0039.html>

[9] [CITE[Issue 265973003: Implement "replacement" text encoding. - Code Review]]
( ([TIME[2014-09-20 01:57:32 +09:00]] 版))
<https://codereview.chromium.org/265973003>

[10] [CITE@en[Mark hz-gb-2312 more clearly as nearly removed · 2b017e7 · whatwg/encoding]]
( ([TIME[2014-10-05 02:07:38 +09:00]] 版))
<https://github.com/whatwg/encoding/commit/2b017e76a148b74cf5f052db854d4f7c2d2cebd7>

[11] [CITE@en[Remove hz-gb-2312 per https://www.w3.org/Bugs/Public/show_bug.cgi?id=253... · 27513da · whatwg/encoding]] ([TIME[2014-11-04 03:30:28 +09:00]] 版) <https://github.com/whatwg/encoding/commit/27513dad60cc80270e28d776939746b040b45fd0>

[18] [CITE@en['''['''cssom''']''' Cleanup some serialization bits.]]
([[emilio]]著, [TIME[2018-05-17 21:20:17 +09:00]])
<https://github.com/w3c/csswg-drafts/commit/5cc9ddd332465b7512befe06dd650754c824645a>


[30] [CITE[Untitled]], [TIME[2025-11-09T14:18:43.000Z]], [TIME[1999-05-01T09:52:37.477Z]] <https://web.archive.org/web/19990501095022/http://www.twinbridge.com/html/clink.html>

[31] >>30 利用サイトのリンク集、なんと[[リンク先]]が [CODE[gopher:]]