public class MyCommonTest
{
[Theory]
- [InlineData("http://ja.wikipedia.org/wiki/Wikipedia", "http://ja.wikipedia.org/wiki/Wikipedia")]
- [InlineData("http://ja.wikipedia.org/wiki/メインページ",
- "http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8")]
- [InlineData("http://fr.wikipedia.org/wiki/Café", "http://fr.wikipedia.org/wiki/Caf%E9")]
- [InlineData("http://ja.wikipedia.org/wiki/勇気100%", "http://ja.wikipedia.org/wiki/%E5%8B%87%E6%B0%97100%25")]
- [InlineData("http://ja.wikipedia.org/wiki/Bio_100%", "http://ja.wikipedia.org/wiki/Bio_100%25")]
- public void urlEncodeMultibyteCharTest(string uri, string expected)
- {
- Assert.Equal(expected, MyCommon.urlEncodeMultibyteChar(uri));
- }
-
- [Theory]
[InlineData("http://日本語.idn.icann.org/", "http://xn--wgv71a119e.idn.icann.org/")]
[InlineData("http://例え.テスト/", "http://xn--r8jz45g.xn--zckzah/")]
public void IDNEncodeTest(string uri, string expected)
}
/// <summary>
- /// URLに含まれているマルチバイト文字列を%xx形式でエンコードします。
- /// <newpara>
- /// マルチバイト文字のコードはUTF-8またはUnicodeで自動的に判断します。
- /// </newpara>
- /// </summary>
- /// <param name="_input">エンコード対象のURL</param>
- /// <returns>マルチバイト文字の部分をUTF-8/%xx形式でエンコードした文字列を返します。</returns>
-
- public static string urlEncodeMultibyteChar(string _input)
- {
- Uri uri = null;
- var sb = new StringBuilder(256);
- var result = "";
- var c_ = 'd';
- foreach (var c in _input)
- {
- c_ = c;
- if (Convert.ToInt32(c) > 127 || c == '%') break;
- }
- if (Convert.ToInt32(c_) <= 127 && c_ != '%') return _input;
-
- var input = Uri.UnescapeDataString(_input);
- retry:
- foreach (char c in input)
- {
- if (Convert.ToInt32(c) > 255)
- {
- // Unicodeの場合(1charが複数のバイトで構成されている)
- // Uriクラスをnewして再構成し、入力をPathAndQueryのみとしてやり直す
- foreach (var b in Encoding.UTF8.GetBytes(c.ToString()))
- {
- sb.AppendFormat("%{0:X2}", b);
- }
- }
- else if (Convert.ToInt32(c) > 127 || c == '%')
- {
- // UTF-8の場合
- // Uriクラスをnewして再構成し、入力をinputからAuthority部分を除去してやり直す
- if (uri == null)
- {
- uri = new Uri(input);
- input = input.Remove(0, uri.GetLeftPart(UriPartial.Authority).Length);
- sb.Length = 0;
- goto retry;
- }
- else
- {
- sb.Append("%" + Convert.ToInt16(c).ToString("X2").ToUpperInvariant());
- }
- }
- else
- {
- sb.Append(c);
- }
- }
-
- if (uri == null)
- {
- result = sb.ToString();
- }
- else
- {
- result = uri.GetLeftPart(UriPartial.Authority) + sb;
- }
-
- return result;
- }
-
- /// <summary>
/// URLのドメイン名をPunycode展開します。
/// <para>
/// ドメイン名がIDNでない場合はそのまま返します。
}
else if (Converter_Type != MyCommon.UrlConverter.Nicoms)
{
- //短縮URL変換 日本語を含むかもしれないのでURLエンコードする
+ // 短縮URL変換
try
{
- var srcUri = new Uri(MyCommon.urlEncodeMultibyteChar(tmp));
+ var srcUri = new Uri(tmp);
var resultUri = await ShortUrl.Instance.ShortenUrlAsync(Converter_Type, srcUri);
result = resultUri.AbsoluteUri;
}
}
else if (Converter_Type != MyCommon.UrlConverter.Nicoms)
{
- //短縮URL変換 日本語を含むかもしれないのでURLエンコードする
+ // 短縮URL変換
try
{
- var srcUri = new Uri(MyCommon.urlEncodeMultibyteChar(tmp));
+ var srcUri = new Uri(tmp);
var resultUri = await ShortUrl.Instance.ShortenUrlAsync(Converter_Type, srcUri);
result = resultUri.AbsoluteUri;
}