Java/JS 日语全半角,平片假名转换

52 篇文章 1 订阅

方式1: 安装icu4

官方Github

https://github.com/unicode-org/icu

import com.ibm.icu.text.Transliterator;

⏹全角转换半角
Transliterator literator1 = Transliterator.getInstance("Fullwidth-Halfwidth");
literator1.transliterate("カナ");  // カナ
  
⏹半角转换全角
Transliterator literator2 = Transliterator.getInstance("Halfwidth-Fullwidth");
literator2.transliterate("カナ");  // カナ

⏹平假名转换片假名
Transliterator literator4 = Transliterator.getInstance("Hiragana-Katakana");
literator4.transliterate("なし");  // ナシ

⏹片假名转换平假名
Transliterator literator3 = Transliterator.getInstance("Katakana-Hiragana");
literator3.transliterate("カナ");  // かな

依赖

<dependency>
        <groupId>com.ibm.icu</groupId>
        <artifactId>icu4j</artifactId>
        <!--此版本过时,Maven仓库获取最新版本-->
        <version>3.4.4</version>
</dependency>

方式2

参考 https://github.com/shogo4405/KanaXS
以下js代码均摘录于KanaXS中,该项目中还包含Java和C#的转换

2.1 全角英数字を半角英数字に変換します

/**
 * 全角英数字を半角英数字に変換します。
 * @example
 * "abcABC123".toHankakuCase(); // abcABC123
 * @return {String}
 */
String.prototype.toHankakuCase = function()
{
	var c, i = this.length, a = [];

	while(i--)
	{
		c = a[i] = this.charCodeAt(i);

		switch(true)
		{
			// 【!】~【~】の範囲
			case (0xFF01 <= c && c <= 0xFF5E):
				a[i] -= 0xFEE0;
				break;
			// 全角スペース
			case (c == 0x3000):
				a[i] = 0x0020;
				break;
		};
	};


	return String.fromCharCode.apply(null, a);
};

2.2 全角のカタカナを半角のカタカナに変換します

/**
 * 全角のカタカナを半角のカタカナに変換します。
 * @example
 * "アイウエオ".toHankanaCase(); // アイウエオ
 * @return 
 */
String.prototype.toHankanaCase = function()
{
	var i, f, c, a = [], m = String.prototype.toHankanaCase.MAPPING;

	for(i = 0, f = this.length;i < f;)
	{
		c = this.charCodeAt(i++);
		switch(true)
		{
			case (c in m):
				a.push(m[c]);
				break;
			case (0x30AB <= c && c <= 0x30C9):
				a.push(m[c - 1], 0xFF9E);
				break;
			case (0x30CF <= c && c <= 0x30DD):
				a.push(m[c - c % 3], [0xFF9E,0xFF9F][c % 3 - 1]);
				break;
			default:
				a.push(c);
				break;
		};
	};
	
	// 那个日本人Github中的代码有bug,当全角片假名为ジャ、ジュ、ジョ等假名时ャ,ュ,ョ无法转换为半角片假名
	// 暂且添加replaceAll("ャ", "ャ").replaceAll("ュ", "ュ").replaceAll("ョ", "ョ") 来应付需求
	return String.fromCharCode.apply(null, a).replaceAll("ャ", "ャ").replaceAll("ュ", "ュ").replaceAll("ョ", "ョ");
};

String.prototype.toHankanaCase.MAPPING =
{
	0x30A1:0xFF67,
	0x30A3:0xFF68,
	0x30A5:0xFF69,
	0x30A7:0xFF6A,
	0x30A9:0xFF6B,
	0x30FC:0xFF70,
	0x30A2:0xFF71,
	0x30A4:0xFF72,
	0x30A6:0xFF73,
	0x30A8:0xFF74,
	0x30AA:0xFF75,
	0x30AB:0xFF76,
	0x30AD:0xFF77,
	0x30AF:0xFF78,
	0x30B1:0xFF79,
	0x30B3:0xFF7A,
	0x30B5:0xFF7B,
	0x30B7:0xFF7C,
	0x30B9:0xFF7D,
	0x30BB:0xFF7E,
	0x30BD:0xFF7F,
	0x30BF:0xFF80,
	0x30C1:0xFF81,
	0x30C4:0xFF82,
	0x30C6:0xFF83,
	0x30C8:0xFF84,
	0x30CA:0xFF85,
	0x30CB:0xFF86,
	0x30CC:0xFF87,
	0x30CD:0xFF88,
	0x30CE:0xFF89,
	0x30CF:0xFF8A,
	0x30D2:0xFF8B,
	0x30D5:0xFF8C,
	0x30D8:0xFF8D,
	0x30DB:0xFF8E,
	0x30DE:0xFF8F,
	0x30DF:0xFF90,
	0x30E0:0xFF91,
	0x30E1:0xFF92,
	0x30E2:0xFF93,
	0x30E4:0xFF94,
	0x30E6:0xFF95,
	0x30E8:0xFF96,
	0x30E9:0xFF97,
	0x30EA:0xFF98,
	0x30EB:0xFF99,
	0x30EC:0xFF9A,
	0x30ED:0xFF9B,
	0x30EF:0xFF9C,
	0x30F2:0xFF66,
	0x30F3:0xFF9D,
	0x30C3:0xFF6F
};

2.3 全角カタカナを全角ひらがに変換します

/**
 * 全角カタカナを全角ひらがに変換します。
 * @example
 * "アイウエオ".toHiraganaCase(); // あいうえお
 * @return {String}
 */
String.prototype.toHiraganaCase = function()
{
	var c, i = this.length, a = [];

	while(i--)
	{
		c = this.charCodeAt(i);
		a[i] = (0x30A1 <= c && c <= 0x30F6) ? c - 0x0060 : c;
	};

	return String.fromCharCode.apply(null, a);
};

2.4 全角ひらがなを全角カタカナに変換します。

/**
 * 全角ひらがなを全角カタカナに変換します。
 * @example
 * "あいうえお".toKatakanaCase(); // アイウエオ
 * @return {String}
 */
String.prototype.toKatakanaCase = function()
{
	var c, i = this.length, a = [];

	while(i--)
	{
		c = this.charCodeAt(i);
		a[i] = (0x3041 <= c && c <= 0x3096) ? c + 0x0060 : c;
	};

	return String.fromCharCode.apply(null, a);
};

2.5 半角英数字を全角英数字に変換します。

/**
 * 半角英数字を全角英数字に変換します。
 * @example
 * "abcABC123".toZenkakuCase(); // abcABC123
 * @return {String}
 */
String.prototype.toZenkakuCase = function()
{
	var c, i = this.length, a = [];

	while(i--)
	{
		c = a[i] = this.charCodeAt(i);
		switch(true)
		{
			case (c <= 0x007E && 0x0021 <= c):
				a[i] += 0xFEE0;
				break;
			case (c == 0x0020):
				a[i] = 0x3000;
				break;
		};
	};

	return String.fromCharCode.apply(null, a);
};

2.6 半角のカタカナを全角のカタカナに変換します。

/**
 * 半角のカタカナを全角のカタカナに変換します。
 * @example
 * "アイウエオ".toZenkanaCase(); // アイウエオ
 * @return {String}
 */
String.prototype.toZenkanaCase = function()
{
	var i, f, c, a = [], m = String.prototype.toZenkanaCase.MAPPING;

	for(i = 0, f = this.length;i < f; i++)
	{
		c = this.charCodeAt(i);
		a.push(m[c] || c);
	};

	return String.fromCharCode.apply(null, a);
};

String.prototype.toZenkanaCase.MAPPING =
{
		0xFF67:0x30A1,
		0xFF68:0x30A3,
		0xFF69:0x30A5,
		0xFF6A:0x30A7,
		0xFF6B:0x30A9,
		0xFF70:0x30FC,
		0xFF71:0x30A2,
		0xFF72:0x30A4,
		0xFF73:0x30A6,
		0xFF74:0x30A8,
		0xFF75:0x30AA,
		0xFF76:0x30AB,
		0xFF77:0x30AD,
		0xFF78:0x30AF,
		0xFF79:0x30B1,
		0xFF7A:0x30B3,
		0xFF7B:0x30B5,
		0xFF7C:0x30B7,
		0xFF7D:0x30B9,
		0xFF7E:0x30BB,
		0xFF7F:0x30BD,
		0xFF80:0x30BF,
		0xFF81:0x30C1,
		0xFF82:0x30C4,
		0xFF83:0x30C6,
		0xFF84:0x30C8,
		0xFF85:0x30CA,
		0xFF86:0x30CB,
		0xFF87:0x30CC,
		0xFF88:0x30CD,
		0xFF89:0x30CE,
		0xFF8A:0x30CF,
		0xFF8B:0x30D2,
		0xFF8C:0x30D5,
		0xFF8D:0x30D8,
		0xFF8E:0x30DB,
		0xFF8F:0x30DE,
		0xFF90:0x30DF,
		0xFF91:0x30E0,
		0xFF92:0x30E1,
		0xFF93:0x30E2,
		0xFF94:0x30E4,
		0xFF95:0x30E6,
		0xFF96:0x30E8,
		0xFF97:0x30E9,
		0xFF98:0x30EA,
		0xFF99:0x30EB,
		0xFF9A:0x30EC,
		0xFF9B:0x30ED,
		0xFF9C:0x30EF,
		0xFF9D:0x30F3,
		0xFF9E:0x309B,
		0xFF9F:0x309C,
		0xFF66:0x30F2
};
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值