[Deno] 全角半角相互変換ライブラリだ！！！

# 概要
Denoで文字列の全角と半角の相互変換するライブラリをつくりました！
一括変換だけでなく部分変換もできます。

deno.landとjsrにも公開しています！
deno.land: https://deno.land/x/zhconv
jsr.io: https://jsr.io/@suwakei/zhconv

Goバージョンもあります！
https://github.com/suwakei/go-zhconv
記事もあります！
https://zenn.dev/keitosuwahara/articles/77a57c54381abd

ぜひREADME代わりに当記事を読んでみてください！
## インストール
主にインストール方法は3種類あります。
ソースコード中にこのようなimport文でdeno.land経由でインポートするか
```typescript
import {h2z, z2h, h2zAt, z2hAt} from "https://deno.land/x/zhconv@1.1.1/mod.ts"
```
jsr経由でインポートするか
```typescript
import {h2z, z2h, h2zAt, z2hAt} from "https://jsr.io/@suwakei/zhconv";
```
denoコマンドを使ってローカルにインストールしてください。
```shell
deno add jsr:@suwakei/zhconv
```

## 機能
```typescript
/**
 * h2z は、文字列中の半角文字を全角文字に変換します。
 * ASCII, カタカナ, 数字, 濁点/半濁点付きカタカナを扱います。
 * @param "str" The input string.
 * @returns The converted string.
 */
function h2z(str: string): string


/**
 * h2zAtは半角から全角に変換した文字列を返します。
 * 変換文字列は第2引数で選択できます。
 * @param "str" The input string.
 * @param "at" Indices of characters to convert.
 * @returns The converted string.
 */
function h2zAt(str: string, ...at: number[]): string


/**
 * z2h は、文字列中の全角文字を半角文字に変換します。
 * ASCII, カタカナ, 数字, 濁点/半濁点付きカタカナを扱います。
 * @param "str" The input string.
 * @returns The converted string.
 */
function z2h(str: string): string


/**
 * z2hAtは全角から半角に変換した文字列を返します。
 * 変換文字列は第2引数で選択できます。
 * @param "str" The input string.
 * @param "at" Indices of characters to convert.
 * @returns The converted string.
 */
function Z2hAt(str: tring, at: number[]): string
```

## 使い方
### h2z関数
h2z は、文字列中の半角文字を全角文字に変換します。
ASCII, カタカナ, 数字, 濁点/半濁点付きカタカナを扱います。
```typescript
import { h2z } from "https://deno.land/x/zhconv@1.1.2/mod.ts"; // or import { h2z } from "https://jsr.io/@suwakei/zhconv";


let result = h2z("Hello, world!")
console.log(result) // Ｈｅｌｌｏ， ｗｏｒｌｄ！.

let result = h2z("") // Empty string.
console.log(result) // "".

let result = h2z("ＡＢＣ１２３アイウガパ") // No conversion needed (Zenkaku).
console.log(result) // ＡＢＣ１２３アイウガパ.

let result = h2z("ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~ \\")
console.log(result) // ＡＢＣｄｅｆ　ＸＹＺ！＃＄％＆’（）＊＋，－．／：；＜＝＞？＠［￥］＾＿‘｛｜｝～　＼.

let result = h2z("0123456789") // Hankaku Digits to Zenkaku.
console.log(result) // ０１２３４５６７８９.

let result = h2z("ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝ") // Hankaku Katakana to Zenkaku.
console.log(result) // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン.

let result = h2z("ｧｨｩｪｫｯｬｭｮ") // Hankaku Katakana (Small) to Zenkaku.
console.log(result) // ァィゥェォッャュョ.

let result = h2z("｡､･ｰ｢｣")// Hankaku Katakana (Symbols) to Zenkaku.
console.log(result) // 。、・ー「」.

let result = h2z("ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞｳﾞ") // Hankaku Katakana with Dakuten to Zenkaku".
console.log(result) // ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ.

let result = h2z( "ﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟ") // Hankaku Katakana with Handakuten to Zenkaku.
console.log(result) // パピプペポ.

let result = h2z("これはﾃｽﾄです｡123 ABC ｱｲｳ ｶﾞｷﾞｸﾞ ﾊﾟﾋﾟﾌﾟ!") // Mixed Hankaku/Zenkaku/Other.
console.log(result) // これはテストです。１２３　ＡＢＣ　アイウ　ガギグ　パピプ！.

let result = h2z(" ｽﾍﾟｰｽ ") // convert from Half width space to Full width space.
console.log(result) //  　スペース　.

let result = h2z("ｱﾞｲﾟﾝﾞ") // Dakuten/Handakuten cannot be applied.
console.log(result) // ア゛イ゜ン゛ Converted to full-width characters as separated( (ｱ->ア, ﾞ->ﾞ).

let result = h2z("①②③㈱㈲") // Not convertible symbols.
console.log(result) // It is assumed that environment dependent characters will not be converted.

let result = h2z("1ﾊﾞｲﾄ文字と2ﾊﾞｲﾄ文字が混在するﾃｷｽﾄ｡ ABC 123 ｶﾞｷﾞｸﾞﾊﾟﾋﾟﾌﾟ!?") // Long string with various conversions.
console.log(result) // １バイト文字と２バイト文字が混在するテキスト。　ＡＢＣ　１２３　ガギグパピプ！？.
```

### z2h関数
z2h は、文字列中の全角文字を半角文字に変換します。
ASCII, カタカナ, 数字, 濁点/半濁点付きカタカナを扱います
```typescript
import { z2h } from "https://deno.land/x/zhconv@1.1.2/mod.ts";


let result = z2h("ＡＢＣｄｅｆ　ＸＹＺ！＃＄％＆’（）＊＋，－．／：；＜＝＞？＠［￥］＾＿‘｛｜｝～")
console.log(result) // ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~

let result = z2h("０１２３４５６７８９")
console.log(result) // 0123456789

let result = z2h("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン")
console.log(result) // ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝ

let result = z2h("ァィゥェォッャュョ")
console.log(result) // ｧｨｩｪｫｯｬｭｮ ヮ is not converted because there is no corresponding character for half-width.

let result = z2h("。、・ー「」")
console.log(result) // ｡､･ｰ｢｣

let result = z2h("ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ")
console.log(result) // ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞｳﾞ

let result = z2h("パピプペポ")
console.log(result) // ﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟ

let result = z2h("　スペース　") // convert from Full width space to half width space
console.log(result) //  ｽﾍﾟｰｽ 

let result = z2h("①②③㈱㈲") // It is assumed that environment dependent characters will not be converted.
console.log(result) // ①②③㈱㈲
```
### h2zAt関数
h2zAtは半角から全角に変換した文字列を返します。
変換文字列は第2引数で選択できます。
```typescript
import { h2zAt } from "https://deno.land/x/zhconv@1.1.2/mod.ts";


let result = h2zAt("Hello, world!", 0, 7)
console.log(result) // Ｈello, ｗorld!.

let result = h2zAt("", 0) // Empty string.
console.log(result) // "".

let result = h2zAt("ＡＢＣ１２３アイウガパ", 0, 5) // No conversion needed (Zenkaku).
console.log(result) // ＡＢＣ１２３アイウガパ.

let result = h2zAt("ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~ \\", 3, 17)
console.log(result) // ABCｄef XYZ!#$%&'（)*+,-./:;<=>?@[¥]^_`{|}~ \\.

let result = h2zAt("0123456789",0, 5) // Hankaku Digits to Zenkaku.
console.log(result) // ０1234５6789.

let result = h2zAt("ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝ", 0) // Hankaku Katakana to Zenkaku.
console.log(result) // アｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝ.

let result = h2zAt("ｧｨｩｪｫｯｬｭｮ", 0) // Hankaku Katakana (Small) to Zenkaku.
console.log(result) // ァｨｩｪｫｯｬｭｮ.
```
### z2hAt関数
z2hAtは全角から半角に変換した文字列を返します。
変換文字列は第2引数で選択できます。
```typescript
import { z2hAt } from "https://deno.land/x/zhconv@1.1.2/mod.ts


let result = z2hAt("Ｈｅｌｌｏ， ｗｏｒｌｄ！", 0, 7)
console.log(result) // Hｅｌｌｏ， wｏｒｌｄ！.

let result = z2hAt("ＡＢＣｄｅｆ　ＸＹＺ！＃＄％＆’（）＊＋，－．／：；＜＝＞？＠［￥］＾＿‘｛｜｝～", 3, 17)
console.log(result) // ＡＢＣdｅｆ　ＸＹＺ！＃＄％＆’（)＊＋，－．／：；＜＝＞？＠［￥］＾＿‘｛｜｝～.

let result = z2hAt("０１２３４５６７８９", 0, 5)
console.log(result) // 0１２３４5６７８９.

let result = z2hAt("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン", 0, 6, 9, 10)
console.log(result) // ｱイウエオカｷクケｺｻシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン.

let result = z2hAt("ァィゥェォッャュョ", 4)
console.log(result) // ァィゥェｫッャュョ.
```