Skip to content

Commit

Permalink
Merge pull request #3 from sakapon/v1.1
Browse files Browse the repository at this point in the history
v1.1.6
  • Loading branch information
sakapon committed Oct 3, 2018
2 parents 34dce59 + 5de983d commit ea27f6c
Show file tree
Hide file tree
Showing 30 changed files with 561 additions and 22 deletions.
21 changes: 19 additions & 2 deletions README.md
Expand Up @@ -4,7 +4,7 @@
[![NuGet](https://img.shields.io/nuget/dt/Zipangu.svg)](https://www.nuget.org/packages/Zipangu/)

A library for compatibility about Japan.
日本における互換性のためのライブラリです
日本で利用される機能を集めたライブラリです

## Setup
Zipangu は NuGet Gallery に登録されています。
Expand All @@ -27,14 +27,20 @@ Install-Package Zipangu
- 半角カタカナ → ひらがな
- 半角カタカナ → カタカナ

### 文字エンコーディング
各エンコーディングのインスタンスにアクセスするためのプロパティを提供します。
- Shift_JIS (932)
- ISO-2022-JP (50220)
- EUC-JP (51932)

## Usage
### 文字の変換
まず、`Zipangu` 名前空間の using ディレクティブを追加します。
```c#
using System;
using Zipangu;
```

### 文字の変換
各メソッドは拡張メソッドとして提供されています。
```c#
// べーとーゔぇん、「ぴあの・そなた」。
Expand All @@ -47,10 +53,21 @@ var result = "ベートーヴェン、「ピアノ・ソナタ」。".H
var result = "ももいろクローバーZ".Convert(KanaConv.AllKanaToKatakana, AsciiConv.ToWide);
```

### 文字エンコーディング
`EncodingHelper` クラスの静的プロパティで各エンコーディングのインスタンスを取得できます。
```c#
// { 188, 172, 151, 144, 81 }
var result = EncodingHelper.ShiftJIS.GetBytes("シャ乱Q");
```

## Target Frameworks
- .NET Standard 2.0
- .NET Framework 4.0

### Dependencies
- [System.Text.Encoding.CodePages](https://www.nuget.org/packages/System.Text.Encoding.CodePages/) (.NET Standard 2.0)

## Release Notes
- **v1.1.6** 文字エンコーディングのプロパティを追加。
- **v1.0.3** 初版リリース。
- **v1.0.1** β版リリース。
65 changes: 65 additions & 0 deletions Zipangu/NetUnitTest/EncodingHelperTest.cs
@@ -0,0 +1,65 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Zipangu;

namespace NetUnitTest
{
[TestClass]
public class EncodingHelperTest
{
[TestMethod]
public void ShiftJIS()
{
var actual = EncodingHelper.ShiftJIS;
Assert.AreEqual(932, actual.CodePage);
Assert.AreEqual("shift_jis", actual.WebName);
}

[TestMethod]
public void ISO2022JP()
{
var actual = EncodingHelper.ISO2022JP;
Assert.AreEqual(50220, actual.CodePage);
Assert.AreEqual("iso-2022-jp", actual.WebName);
}

[TestMethod]
public void EUCJP()
{
var actual = EncodingHelper.EUCJP;
Assert.AreEqual(51932, actual.CodePage);
Assert.AreEqual("euc-jp", actual.WebName);
}

[TestMethod]
public void ShiftJIS_GetString()
{
var text = "シャ乱Q";
var bytes = new byte[] { 188, 172, 151, 144, 81 };

Assert.AreEqual(text, EncodingHelper.ShiftJIS.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.ShiftJIS.GetBytes(text));
}

[TestMethod]
public void ISO2022JP_GetString()
{
// 半角カタカナは存在しません。
var text = "シャ乱Q";
var bytes = new byte[] { 27, 36, 66, 37, 55, 37, 99, 77, 112, 27, 40, 66, 81 };

Assert.AreEqual(text, EncodingHelper.ISO2022JP.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.ISO2022JP.GetBytes(text));
}

[TestMethod]
public void EUCJP_GetString()
{
var text = "シャ乱Q";
var bytes = new byte[] { 142, 188, 142, 172, 205, 240, 81 };

Assert.AreEqual(text, EncodingHelper.EUCJP.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.EUCJP.GetBytes(text));
}
}
}
23 changes: 21 additions & 2 deletions Zipangu/NetUnitTest/KanaConversionTest.cs
Expand Up @@ -8,6 +8,11 @@ namespace NetUnitTest
[TestClass]
public class KanaConversionTest
{
static readonly string AllKanas = EnumerableHelper.RangeChars(' ', '〕').Replace("", "")
+ EnumerableHelper.RangeChars('ぁ', 'ゖ')
+ EnumerableHelper.RangeChars('゛', 'ヿ')
+ EnumerableHelper.RangeChars('。', '゚');

[TestMethod]
public void HiraganaToKatakana()
{
Expand All @@ -32,9 +37,11 @@ public void HiraganaToKatakana_VB()
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToKatakana_VB);

Test("");
Test(KanaConversion.Hiraganas);
Test(AllKanas.Replace("ゕゖ", "").Replace("ゟ゠", "").Replace("ヷヸヹヺ", "").Replace("", ""));

Test_VB(null, "");
// "?" に変換されます。
Test_VB("ゕゖゟ゠ヷヸヹヺヿ", new string('?', 9));
}

[TestMethod]
Expand All @@ -61,13 +68,17 @@ public void KatakanaToHiragana_VB()
var Test_VB = TestHelper.CreateAssertion<string, string>(VBStringsHelper.ToHiragana_VB);

Test("");
Test(KanaConversion.Katakanas.Replace("", ""));
Test(AllKanas.Replace("ゔゕゖ", "").Replace("ゟ゠", "").Replace("ヴヵヶヷヸヹヺ", "").Replace("", ""));

Test_VB(null, "");
// カタカナの "ヴ" に変換されます。
Test_VB("", "");
// カタカナの "ヴ" は変換されません。
Test_VB("", "");
// "?" に変換されます。
Test_VB("ヵヶ", new string('?', 2));
// "?" に変換されます。
Test_VB("ゕゖゟ゠ヷヸヹヺヿ", new string('?', 9));
}

[TestMethod]
Expand Down Expand Up @@ -103,6 +114,10 @@ public void HalfKatakanaToHiragana_VB()
Test_VB(null, "");
// カタカナの "ヴ" に変換されます。
Test_VB("ヴ", "");
// "?" に変換されます。
Test_VB("ヷヸヹヺ", new string('?', 4));
// "?" に変換されます。
Test_VB("ヺヷ", new string('?', 2));
}

[TestMethod]
Expand Down Expand Up @@ -136,6 +151,10 @@ public void HalfKatakanaToKatakana_VB()
Test(string.Concat(KanaConversion.SemiVoiceableHalfKatakanas.Select(c => $"{c}")));

Test_VB(null, "");
// "?" に変換されます。
Test_VB("ヷヸヹヺ", new string('?', 4));
// "?" に変換されます。
Test_VB("ヺヷ", new string('?', 2));
}
}
}
1 change: 1 addition & 0 deletions Zipangu/NetUnitTest/NetUnitTest.csproj
Expand Up @@ -55,6 +55,7 @@
<Compile Include="AsciiConversionTest.cs" />
<Compile Include="TestHelper.cs" />
<Compile Include="CharConversionTest.cs" />
<Compile Include="EncodingHelperTest.cs" />
<Compile Include="VBStringsTest.cs" />
<Compile Include="VBStringsHelper.cs" />
</ItemGroup>
Expand Down
45 changes: 43 additions & 2 deletions Zipangu/NetUnitTest/VBStringsTest.cs
Expand Up @@ -11,6 +11,13 @@ namespace NetUnitTest
[TestClass]
public class VBStringsTest
{
static readonly string TargetChars = EnumerableHelper.RangeChars(' ', '~')
+ EnumerableHelper.RangeChars(' ', '〕').Replace("", "")
+ EnumerableHelper.RangeChars('ぁ', 'ゖ')
+ EnumerableHelper.RangeChars('゛', 'ヿ')
+ EnumerableHelper.RangeChars('!', '~')
+ EnumerableHelper.RangeChars('。', '゚');

static string ToMessage1(char c) => $"({(int)c:D5}-{(int)c:X4}) {c}";
static string ToMessage2(char c) => $"{c} ({(int)c:D5}-{(int)c:X4})";

Expand All @@ -20,7 +27,7 @@ static void WriteChanged_Wide(VbStrConv mode)
var changed = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Select(c => new { before = c, after = Strings.StrConv(c.ToString(), mode).Single() })
.Where(_ => _.before != _.after)
.Where(_ => _.after != '?' || _.before == '?')
.Where(_ => TargetChars.Contains(_.before) || _.after != '?')
.Select(_ => $"{ToMessage1(_.before)} > {ToMessage2(_.after)}")
.ToArray();

Expand All @@ -33,13 +40,35 @@ static void WriteChanged_Narrow(VbStrConv mode)
var changed = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Select(c => new { before = c, after = Strings.StrConv(c.ToString(), mode) })
.Where(_ => _.before.ToString() != _.after)
.Where(_ => _.after != "?" || _.before == '?')
.Where(_ => TargetChars.Contains(_.before) || _.after != "?")
.Select(_ => $"{ToMessage1(_.before)} > {(_.after.Length == 1 ? ToMessage2(_.after[0]) : _.after)}")
.ToArray();

File.WriteAllLines($"VBStrings-{mode.ToString().Replace(", ", "")}.txt", changed, Encoding.UTF8);
}

static void WriteChanged_Voiced(VbStrConv mode)
{
var changed = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Select(c => new { before = c, after = Strings.StrConv($"{c}", mode) })
.Where(_ => _.after.Length == 1)
.Select(_ => $"{ToMessage1(_.before)} > {ToMessage2(_.after[0])}")
.ToArray();

File.WriteAllLines($"VBStrings-{mode.ToString().Replace(", ", "")}-Voiced.txt", changed, Encoding.UTF8);
}

static void WriteChanged_SemiVoiced(VbStrConv mode)
{
var changed = EnumerableHelper.RangeChars(char.MinValue, char.MaxValue)
.Select(c => new { before = c, after = Strings.StrConv($"{c}", mode) })
.Where(_ => _.after.Length == 1)
.Select(_ => $"{ToMessage1(_.before)} > {ToMessage2(_.after[0])}")
.ToArray();

File.WriteAllLines($"VBStrings-{mode.ToString().Replace(", ", "")}-SemiVoiced.txt", changed, Encoding.UTF8);
}

[TestMethod]
public void Wide() => WriteChanged_Wide(VbStrConv.Wide);

Expand All @@ -63,5 +92,17 @@ static void WriteChanged_Narrow(VbStrConv mode)

[TestMethod]
public void NarrowHiragana() => WriteChanged_Narrow(VbStrConv.Narrow | VbStrConv.Hiragana);

[TestMethod]
public void WideKatakana_Voiced() => WriteChanged_Voiced(VbStrConv.Wide | VbStrConv.Katakana);

[TestMethod]
public void WideHiragana_Voiced() => WriteChanged_Voiced(VbStrConv.Wide | VbStrConv.Hiragana);

[TestMethod]
public void WideKatakana_SemiVoiced() => WriteChanged_SemiVoiced(VbStrConv.Wide | VbStrConv.Katakana);

[TestMethod]
public void WideHiragana_SemiVoiced() => WriteChanged_SemiVoiced(VbStrConv.Wide | VbStrConv.Hiragana);
}
}
65 changes: 65 additions & 0 deletions Zipangu/UnitTest/EncodingHelperTest.cs
@@ -0,0 +1,65 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Zipangu;

namespace UnitTest
{
[TestClass]
public class EncodingHelperTest
{
[TestMethod]
public void ShiftJIS()
{
var actual = EncodingHelper.ShiftJIS;
Assert.AreEqual(932, actual.CodePage);
Assert.AreEqual("shift_jis", actual.WebName);
}

[TestMethod]
public void ISO2022JP()
{
var actual = EncodingHelper.ISO2022JP;
Assert.AreEqual(50220, actual.CodePage);
Assert.AreEqual("iso-2022-jp", actual.WebName);
}

[TestMethod]
public void EUCJP()
{
var actual = EncodingHelper.EUCJP;
Assert.AreEqual(51932, actual.CodePage);
Assert.AreEqual("euc-jp", actual.WebName);
}

[TestMethod]
public void ShiftJIS_GetString()
{
var text = "シャ乱Q";
var bytes = new byte[] { 188, 172, 151, 144, 81 };

Assert.AreEqual(text, EncodingHelper.ShiftJIS.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.ShiftJIS.GetBytes(text));
}

[TestMethod]
public void ISO2022JP_GetString()
{
// 半角カタカナは存在しません。
var text = "シャ乱Q";
var bytes = new byte[] { 27, 36, 66, 37, 55, 37, 99, 77, 112, 27, 40, 66, 81 };

Assert.AreEqual(text, EncodingHelper.ISO2022JP.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.ISO2022JP.GetBytes(text));
}

[TestMethod]
public void EUCJP_GetString()
{
var text = "シャ乱Q";
var bytes = new byte[] { 142, 188, 142, 172, 205, 240, 81 };

Assert.AreEqual(text, EncodingHelper.EUCJP.GetString(bytes));
CollectionAssert.AreEqual(bytes, EncodingHelper.EUCJP.GetBytes(text));
}
}
}
19 changes: 19 additions & 0 deletions Zipangu/UnitTest/UnitTest.csproj
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.3.2" />
<PackageReference Include="MSTest.TestFramework" Version="1.3.2" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Zipangu\Zipangu.csproj" />
</ItemGroup>

</Project>
8 changes: 7 additions & 1 deletion Zipangu/Zipangu.sln
Expand Up @@ -3,10 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2016
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zipangu", "Zipangu\Zipangu.csproj", "{EB4C703B-3056-4303-AEAD-137EA8C1DF85}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Zipangu", "Zipangu\Zipangu.csproj", "{EB4C703B-3056-4303-AEAD-137EA8C1DF85}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetUnitTest", "NetUnitTest\NetUnitTest.csproj", "{46A0E652-37BA-4B8C-9831-79C4AC5838AE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest", "UnitTest\UnitTest.csproj", "{E770B68E-EC29-44CA-A32A-3B011E05C153}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -21,6 +23,10 @@ Global
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{46A0E652-37BA-4B8C-9831-79C4AC5838AE}.Release|Any CPU.Build.0 = Release|Any CPU
{E770B68E-EC29-44CA-A32A-3B011E05C153}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E770B68E-EC29-44CA-A32A-3B011E05C153}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E770B68E-EC29-44CA-A32A-3B011E05C153}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E770B68E-EC29-44CA-A32A-3B011E05C153}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
2 changes: 1 addition & 1 deletion Zipangu/Zipangu/AsciiConversion.cs
Expand Up @@ -6,7 +6,7 @@ namespace Zipangu
{
/// <summary>
/// ASCII 文字を変換するためのメソッドを提供します。
/// <c>Microsoft.VisualBasic.Strings.StrConv</c> メソッドとの互換性はありません
/// <see cref="Microsoft.VisualBasic.Strings.StrConv"/> メソッドとの互換性は完全ではありません
/// </summary>
public static class AsciiConversion
{
Expand Down
2 changes: 1 addition & 1 deletion Zipangu/Zipangu/CharConversion.cs
Expand Up @@ -4,7 +4,7 @@ namespace Zipangu
{
/// <summary>
/// 文字を変換するためのメソッドを提供します。
/// <c>Microsoft.VisualBasic.Strings.StrConv</c> メソッドとの互換性はありません
/// <see cref="Microsoft.VisualBasic.Strings.StrConv"/> メソッドとの互換性は完全ではありません
/// </summary>
public static class CharConversion
{
Expand Down

0 comments on commit ea27f6c

Please sign in to comment.