################################################################################
# Jacode4e Хуурцаг Лавлах (MN)
# Jacode4e - Converts Character Encodings for Enterprise in Japan
# https://metacpan.org/dist/Jacode4e
# Copyright (c) 2026 INABA Hitoshi <ina.cpan@gmail.com>
################################################################################

======================================================================
Jacode4e Хурдан лавлах (Монгол)
======================================================================

[ҮНДСЭН ХЭРЭГЛЭЭ]

  use FindBin;
  use lib "$FindBin::Bin/lib";
  use Jacode4e;

  $char_count = Jacode4e::convert(\$line, $OUTPUT_encoding, $INPUT_encoding);
  $char_count = Jacode4e::convert(\$line, $OUTPUT_encoding, $INPUT_encoding, { %option });

  $line             : хөрвүүлэх мөр (лавлагаагаар дамжуулна, байрандаа дарж бичнэ)
  $OUTPUT_encoding  : гаралтын кодлолтын нэр
  $INPUT_encoding   : оролтын кодлолтын нэр
  $char_count       : хөрвүүлсний дараах тэмдэгтийн тоо

[КОДЛОЛТЫН НЭРСИЙН ЖАГСААЛТ]

  mnemonic    description
  ---------   ---------------------------------------------------
  cp932x      CP932X (Extended CP932 to JIS X 0213, single-shift 0x9C5A)
  cp932       Microsoft CP932 (Windows-31J / IANA registered name)
  cp932ibm    IBM CP932
  cp932nec    NEC CP932
  sjis        JISC Shift_JIS (JIS X 0201, JIS X 0208); year editions below
  sjis2004    JISC Shift_JIS-2004 (JIS X 0213:2004)
  euc         JISC EUC-JP (JIS X 0201, JIS X 0208, JIS X 0212); year editions below
  euc2004     JISC EUC-JIS-2004 (JIS X 0213 plane 1 and plane 2)
  jis         JISC ISO-2022-JP (JIS X 0201, JIS X 0208, JIS X 0212); year editions below
  jis2004     JISC ISO-2022-JP-2004 (JIS X 0213 plane 1 and plane 2)
  cp00930     IBM CP00930 (CP00290+CP00300, CCSID 5026 katakana)
  keis78      HITACHI KEIS78
  keis83      HITACHI KEIS83
  keis90      HITACHI KEIS90
  jef         FUJITSU JEF (12pt, use OUTPUT_SHIFTING option for shift codes)
  jef9p       FUJITSU JEF ( 9pt, use OUTPUT_SHIFTING option for shift codes)
  jipsj       NEC JIPS(J)
  jipse       NEC JIPS(E)
  letsj       UNISYS LetsJ
  utf8        UTF-8.0 (aka UTF-8)
  utf8.1      UTF-8.1 (conversion based on Shift_JIS-to-Unicode mapping, not CP932)
  utf8jp      UTF-8-SPUA-JP (JIS X 0213 on SPUA ordered by JIS level/plane/row/cell)

  sjis / euc / jis-ийн оны хувилбарууд (онгүй нэр нь 1990 оны хувилбар):
    sjis1978  euc1978  jis1978   JIS C 6226-1978
    sjis1983  euc1983  jis1983   JIS X 0208-1983
    sjis1990  euc1990  jis1990   JIS X 0208-1990  (= sjis / euc / jis)
    sjis2000  euc2000  jis2000   JIS X 0213:2000
    sjis2004  euc2004  jis2004   JIS X 0213:2004

[JIS СТАНДАРТЫН ОНООР ЯЛГАА (эхлэн суралцагчдад)]

  Японы ханзыг үе шаттайгаар стандартчилсан. Ижил байт нь хувилбар бүрд өөр тэмдэгт байж болох тул өгөгдөлдөө тохирох хувилбарыг сонго. Мэдэхгүй бол онгүй sjis / euc / jis ашигла.

  1978 (JIS C 6226-1978) : анхны ханзны стандарт (1-р ба 2-р түвшин).
  1983 (JIS X 0208-1983) : 22 хос ханзны кодыг сольж, зарим дүрсийг өөрчилсөн; хуучин өгөгдөл эвдрэх хамгийн түгээмэл шалтгаан.
  1990 (JIS X 0208-1990) : зөвхөн 2 ханз нэмсэн (U+51DC, U+7199); онгүй sjis / euc / jis нь энэ хувилбар.
  2000 (JIS X 0213:2000) : том тэлэлт; шинэ 2-р хавтгайд 3, 4-р түвшний ханз, тэмдэг нэмсэн.
  2004 (JIS X 0213:2004) : 10 ханз нэмж, 168 ханзны жишиг дүрсийг өөрчилсөн (код 2000-тай ижил, зөвхөн дүрс шинэ).

[СОНГОЛТУУД]

  Сонголтуудыг 4 дэх аргумент болгон дамжуул: { 'KEY' => утга, ... }

  INPUT_LAYOUT
    'S' (1 байт SBCS), 'D' (2 байт DBCS)-аар тогтмол бичлэгийн байрлал; үсэг бүрийн ард давталтын тоо орж болно. Анхдагч: автомат.
    e.g. Jacode4e::convert(\$line,'cp932x','cp00930',{'INPUT_LAYOUT'=>'S2D2SD'});

  OUTPUT_SHIFTING
    Үнэн: DBCS дараалал орчимд shift-out/shift-in код гаргана. Анхдагч: худал.
    e.g. Jacode4e::convert(\$line,'jef','cp932x',{'OUTPUT_SHIFTING'=>1});

  SPACE
    DBCS/MBCS зайн дүүргэх код (хоёртын мөр). Анхдагч: тухайн кодлолтын зай.
    e.g. Jacode4e::convert(\$line,'cp932x','cp00930',{'SPACE'=>"\x81\xA1"});

  GETA
    Буулгаж чадахгүй тэмдэгтэд зориулсан DBCS/MBCS geta код.
    e.g. Jacode4e::convert(\$line,'cp932x','cp00930',{'GETA'=>"\x81\xA2"});

  OVERRIDE_MAPPING
    Тэмдэгт тус бүрийн FROM => TO дарж бичих hash лавлагаа (SPACE-ийг мөн дарж бичнэ).
    e.g. Jacode4e::convert(\$line,'cp932x','cp00930',{'OVERRIDE_MAPPING'=>{"\x44\x5A"=>"\x81\x7C"}});

  JIS_SOSI
    Үнэн: 'jis' оролтод SO (0x0E)/SI (0x0F)-ийг JIS X 0201 Катаканад шилжих гэж үзнэ (JIS7 зуршил). Анхдагч: худал; оролт 'jis' үед.
    e.g. Jacode4e::convert(\$line,'utf8','jis',{'JIS_SOSI'=>1});

  JIS_X0212
    Үнэн: 'jis' гаралтад JIS X 0212-т байгаа боловч JIS X 0208-д байхгүй тэмдэгтийг ESC $ ( D гэж бичнэ. OUTPUT_SHIFTING шаардлагатай. Анхдагч: худал.
    e.g. Jacode4e::convert(\$line,'jis','utf8',{'JIS_X0212'=>1,'OUTPUT_SHIFTING'=>1});

  JIS_KANA
    'jis' гаралтын Катакана хэв маяг: 'GR' (0xA1..0xDF), 'I' (ESC ( I, OUTPUT_SHIFTING шаардлагатай), 'SO' (SO/GL/SI). Анхдагч: 'GR'.
    e.g. Jacode4e::convert(\$line,'jis','utf8',{'JIS_KANA'=>'SO','OUTPUT_SHIFTING'=>1});

  JIS_DBCS
    'jis' гаралтын DBCS escape: 'B' (ESC $ B), '@' (ESC $ @), '&@B', '(B', '(@'. Анхдагч: 'B'; гаралт 'jis' үед.
    e.g. Jacode4e::convert(\$line,'jis','utf8',{'JIS_DBCS'=>'@'});

  JIS_SBCS
    'jis' гаралтын SBCS escape: 'B' (ESC ( B ASCII), 'J' (ESC ( J Roman), 'H' (ESC ( H хуучин). Анхдагч: 'B'; гаралт 'jis' үед.
    e.g. Jacode4e::convert(\$line,'jis','utf8',{'JIS_SBCS'=>'J'});

  JIS2004_PLANE1
    'jis2004' гаралтын 1-р хавтгайн escape: 'Q' (ESC $ ( Q, :2004), 'O' (ESC $ ( O, :2000). Анхдагч: 'Q'; гаралт 'jis2004' үед.
    e.g. Jacode4e::convert(\$line,'jis2004','utf8',{'JIS2004_PLANE1'=>'O'});

  ROUND_TRIP
    Үнэн: эргэх хөрвүүлэлт; уугуул кодгүй тэмдэгтийг хэрэглэгчийн тодорхойлсон (GAIJI) мужид байрлуулснаар "A-аас B" ба "B-ээс A" эх өгөгдлийг сэргээнэ. Хоёр чиглэлд ROUND_TRIP=>1 ба ИЖИЛ Jacode4e хувилбар шаардлагатай. Анхдагч: худал (буулгаж чадахгүй бол GETA). Хүснэгтийг анх ашиглах үед lazy үүсгэнэ.
    e.g. Jacode4e::convert(\$line,'cp00930','utf8',{'ROUND_TRIP'=>1});

[SHIFT КОДЫН ЛАВЛАХ]

  encoding  shift-out (DBCS start)  shift-in (DBCS end)
  --------  ---------------------   -------------------
  cp00930   0x0E                    0x0F
  keis78    0x0A 0x42               0x0A 0x41
  keis83    0x0A 0x42               0x0A 0x41
  keis90    0x0A 0x42               0x0A 0x41
  jef       0x28                    0x29
  jef9p     0x38                    0x29
  jipsj     0x1A 0x70               0x1A 0x71
  jipse     0x3F 0x75               0x3F 0x76
  letsj     0x93 0x70               0x93 0xF1

[ПРОГРАМЧЛАЛЫН ЖИШЭЭ]

  # 1) UTF-8-аас mainframe кодлолт руу (shift, зай, geta-тай)
  use FindBin;
  use lib "$FindBin::Bin/lib";
  use Jacode4e;
  while (<>) {
      $char_count = Jacode4e::convert(\$_, 'cp00930', 'utf8', {
          'OUTPUT_SHIFTING' => 1,
          'SPACE'           => "\x40\x40",
          'GETA'            => "\x44\x4B",
      });
      print $_;
  }

  # 2) хуучин 1978 Shift_JIS-аас UTF-8 руу (оноор)
  Jacode4e::convert(\$line, 'utf8', 'sjis1978');

  # 3) эргэх: UTF-8 -> CP00930 -> UTF-8 эх өгөгдлийг сэргээнэ
  Jacode4e::convert(\$line, 'cp00930', 'utf8', { 'ROUND_TRIP' => 1 });
  Jacode4e::convert(\$line, 'utf8', 'cp00930', { 'ROUND_TRIP' => 1 });

======================================================================
