.NET 文字列からバイト単位で部分文字列を取得する

C#、VB.NETで半角を1バイト、全角を2バイトとして、指定したバイト数の部分文字列を取得する、SubstringByteメソッドを作成しました。
 
SubstringByteメソッドに「対象の文字列」、「開始位置のバイト(0から始まるインデックス)」、「部分文字列のバイト数」を指定し実行すると部分文字列を取得できます。
 
StringUtility utility = new StringUtility();

utility.SubstringByte("1あいうえお", 2, 6);
実行結果:”いう”
 
上記のように指定すると「あ」の後ろ半分から「え」の前半分までの6バイトの部分文字列を対象とし、文字化けする最初と最後の文字を除去した「いう」を返します。
 
半角を1バイト、全角を2バイトは文字エンコーディングに「シフトJIS」を指定した場合ですが、「.NET 文字列のバイト数を取得する」と同様に他の文字エンコーディングにも対応しております。
 
以下のエリアではSubstringByteメソッドを実際に動かした時の挙動を確認できます。
 
StringUtility utility = new StringUtility();

utility.SubstringByte(
    
 ", 
 , 
 );
実行結果:
“”
 
※実行結果の半角スペースは「¸」で表します。
 
SubstringByteメソッドのソースコードは以下になります。
 
        /// <summary>
        /// 文字エンコーディング
        /// </summary>
        private Encoding _myEncoding = Encoding.GetEncoding("Shift_JIS");

        /// <summary>
        /// 文字エンコーディング
        /// </summary>
        public Encoding MyEncoding
        {
            get
            {
                return this._myEncoding;
            }
        }

        /// <summary>
        /// 文字列からバイト単位で部分文字列を取得します
        /// </summary>
        /// <param name="target">対象の文字列</param>
        /// <param name="startIndexByte">開始位置インデックスバイト</param>
        /// <param name="lengthByte">部分文字列のバイト数</param>
        /// <returns>文字列からバイト単位で取得した部分文字列</returns>
        public string SubstringByte(string target, int startIndexByte, int lengthByte)
        {
            if (startIndexByte < 0)
            {
                throw new ArgumentOutOfRangeException(
                    "開始位置インデックスバイトが0未満です。");
            }

            if (lengthByte < 0)
            {
                throw new ArgumentOutOfRangeException(
                    "部分文字列のバイト数が0未満です。");
            }

            // 対象の文字列をバイト配列にする
            byte[] targetBytes = MyEncoding.GetBytes(target);

            // 開始位置インデックスバイト+部分文字列のバイト数が文字列のバイト数を超える場合
            if (targetBytes.Length < startIndexByte + lengthByte)
            {
                throw new ArgumentOutOfRangeException("開始位置インデックスバイトまたは部分文字列のバイト数の指定に誤りがあります。");
            }

            // 対象の文字列からバイト単位で部分文字列を取得
            string partialString = MyEncoding.GetString(
                targetBytes, startIndexByte, lengthByte);

            // 先頭に全角文字途中の要素が混入している場合は除去
            partialString = TrimHeadHalfwayDoubleByteCharacter(
                partialString, target, targetBytes, startIndexByte);

            // 末尾に全角文字途中の要素が混入している場合は除去
            partialString = TrimEndHalfwayDoubleByteCharacter(
                partialString, target, targetBytes, startIndexByte, lengthByte);

            return partialString;
        }

        /// <summary>
        /// 先頭に全角文字途中の要素が混入している場合は除去します
        /// </summary>
        /// <param name="partialString">部分文字列</param>
        /// <param name="target">対象の文字列</param>
        /// <param name="targetBytes">対象の文字列のバイト配列</param>
        /// <param name="startIndexByte">開始位置インデックスバイト</param>
        /// <returns>先頭の全角文字途中の要素を除去した部分文字列</returns>
        private string TrimHeadHalfwayDoubleByteCharacter(
            string partialString, string target, byte[] targetBytes, int startIndexByte)
        {
            // 部分文字列が空の場合
            if (partialString == string.Empty)
            {
                return partialString;
            }

            // 開始位置の要素を含む部分文字列を取得
            string leftString = MyEncoding.GetString(targetBytes, 0, startIndexByte + 1);

            // 部分文字列の先頭要素が一致する場合
            if (target[leftString.Length - 1] == partialString[0])
            {
                return partialString;
            }

            // 先頭の全角文字途中の要素を除去
            return partialString.Substring(1);
        }

        /// <summary>
        /// 末尾に全角文字途中の要素が混入している場合は除去します
        /// </summary>
        /// <param name="partialString">部分文字列</param>
        /// <param name="target">対象の文字列</param>
        /// <param name="targetBytes">対象の文字列のバイト配列</param>
        /// <param name="startIndexByte">開始位置インデックスバイト</param>
        /// <param name="lengthByte">部分文字列のバイト数</param>
        /// <returns>末尾の全角文字途中の要素を除去した部分文字列</returns>
        private string TrimEndHalfwayDoubleByteCharacter(
            string partialString, string target, byte[] targetBytes, int startIndexByte,
            int lengthByte)
        {
            // 部分文字列が空の場合
            if (partialString == string.Empty)
            {
                return partialString;
            }

            // 最終要素を含む部分文字列を取得
            string leftString = MyEncoding.GetString(
                targetBytes, 0, startIndexByte + lengthByte);

            // 部分文字列の最終要素が一致する場合
            if (target[leftString.Length - 1] == partialString[partialString.Length - 1])
            {
                return partialString;
            }

            // 末尾の全角文字途中の要素を除去
            return partialString.Substring(0, partialString.Length - 1);
        }
 
 
Clipボタンをクリックすると、「StringUtility」というクラスがコピーされます。このソースを「StringUtility.cs」ファイルにコピーするとすぐご利用いただけます。
 

.NET 文字列のバイト数を取得する

C#、VB.NETで半角を1バイト、全角を2バイトとして、文字列のバイト数を取得するGetByteCountメソッドを作成しました。
 
StringUtility utility = new StringUtility();

utility.GetByteCount("1あいうえお");
実行結果:11
 
半角を1バイト、全角を2バイトは文字エンコーディングに「シフトJIS」を指定した場合ですが、もちろん他の文字エンコーディングにも対応しております。
 
たとえば全ての文字を2バイトで表すUnicodeを指定した場合は、
 
StringUtility utility = new StringUtility(Encoding.Unicode);

utility.GetByteCount("1あいうえお");
実行結果:12
 
となります。
 
以下のエリアではGetByteCountメソッドを実際に動かした時の挙動を確認できます。
 
StringUtility utility = new StringUtility(
    
Encoding.GetEncoding(
 "));
 
utility.GetByteCount(
 ");
実行結果:
 
 
GetByteCountメソッドのソースコードは以下になります。
 
        /// <summary>
        /// 文字エンコーディング
        /// </summary>
        private Encoding _myEncoding = Encoding.GetEncoding("Shift_JIS");

        /// <summary>
        /// 文字エンコーディング
        /// </summary>
        public Encoding MyEncoding
        {
            get
            {
                return this._myEncoding;
            }
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public StringUtility()
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="encoding">文字エンコーディング</param>
        public StringUtility(Encoding encoding)
        {
            this._myEncoding = encoding;
        }

        /// <summary>
        /// 文字列のバイト数を取得します
        /// </summary>
        /// <param name="target">対象の文字列</param>
        /// <returns>文字列のバイト数</returns>
        public int GetByteCount(string target)
        {
            return MyEncoding.GetByteCount(target);
        }
 
 
Clipボタンをクリックすると、「StringUtility」というクラスがコピーされます。このソースを「StringUtility.cs」ファイルにコピーするとすぐご利用いただけます。
 

SNSでのシェア数を計測するソーシャルカウンター

 

2進数、8進数文字列を整数に変換する

16進数文字列を整数に変換する」でご紹介した「Convert」クラスを利用すると、16進数だけではなく2進数や8進数の文字列も整数に変換することができます。
 
●2進数文字列 ⇔ 整数
Convert.ToInt32("10011010010", 2);
実行結果:
1234
 
Convert.ToString(1234, 2);
実行結果:
"10011010010"
 
●8進数文字列 ⇔ 整数
Convert.ToInt32("15205", 8);
実行結果:
6789
 
Convert.ToString(6789, 8);
実行結果:
"15205"
 
以下のエリアでは「Convert」クラスのメソッドを実際に動かした時の挙動を確認できます。
 
●2進数文字列 ⇒ 整数
Convert.ToInt32(" 
 ", 2);    
実行結果:
 
●整数 ⇒ 2進数文字列
Convert.ToString( 
 , 2);    
実行結果:
""
 
●8進数文字列 ⇒ 整数
Convert.ToInt32(" 
 ", 8);    
実行結果:
 
●整数 ⇒ 8進数文字列
Convert.ToString( 
 , 8);    
実行結果:
""
 

16進数文字列を整数に変換する

C#、VB.NETで16進数の文字列を整数に変換したり、整数を16進数の文字列に変換するには「Convert」クラスを使うと便利です。
 
●16進数文字列 ⇒ 整数
Convert.ToInt32("FFFF", 16);
実行結果:
65535
 
●整数 ⇒ 16進数文字列
Convert.ToString(65535, 16);
実行結果:
"ffff"
 
以下のエリアでは「Convert」クラスのメソッドを実際に動かした時の挙動を確認できます。
 
●16進数文字列 ⇒ 整数
Convert.ToInt32(" 
 ", 16);    
実行結果:
 
※16進数文字列にはプレフィクス「0x」をつけることができます。
 
●整数 ⇒ 16進数文字列
Convert.ToString( 
 , 16);    
実行結果:
""
 

.NET 整数を切り上げる

C#、VB.NETで整数を切り上げる場合も、「.NET 小数点以下を切り上げる」で作成したRoundUpメソッドが利用できます。
 
        /// <summary>
        /// 値の小数部を切り上げ、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <returns>丸められた値</returns>
        private double RoundUp(double value, int decimals)
        {
            // 小数部桁数の10の累乗を取得
            double pow = Math.Pow(10, decimals);

            return 0 <= value ? Math.Ceiling(value * pow) / pow :
                Math.Floor(value * pow) / pow;
        }
 
 
このページでは、上記RoundUpメソッドを実際に動かした時の挙動を確認できます。
 
小数部桁数に「-3」を指定すると100の位を切り上げます。「1400」⇒「2000」という動きになり、ExcelのROUNDUPメソッドと同じ動作をします。もちろん通常通り小数点以下を切り上げることもできます。
 
RoundUp( 
 , 
 ); 
実行結果:
 
 

「今日は何の日」APIを作成しました

「今日は何の日」の情報を取得するため、MIZUNOTOMOAKI.COMさんのAPIを使用していたのですが、昨日あたりからアクセスできなくなっていますので、同じ動きをするAPIをphpで自作しました。
 
ソースコードは「こちら」になります(文字化けする場合はエンコードを「UTF-8」にしてください)。
 
※最初APIを公開しようとも思いましたが、現在契約しているレンタルサーバーに負荷をかけることはできませんので、各自のサービスに組み込んでご利用ください。
 
http://sample.com/wikipedia_daytopic.php?monthday=2月29日
 
のようにURL引数の「monthday」に月日を指定することで、指定した月日の出来事、誕生日の著名人、忌日の著名人の情報をXML形式で取得できます。
 
※「monthday」を省略すると、今日のトピックを取得します。
 
月日の説明は「description」、出来事は「events」、誕生日は「birthday」、忌日は「anniversary」ノードの「item」要素をご参照ください。
 
以下は上記APIを使ったサンプルです。「更新」をクリックすると、今日の出来事と誕生日が切り替わります。
 
 
 

2014年11月14日(金)のバズワード 桑島智輝、V6 長野博をピックアップ

急上昇ワード今日の天気運行情報為替と株の値動き今日は何の日?
●急上昇ワード
順位 急上昇ワード
1
2
3
4
5
6
7
8
9
10
●今日の天気は?
都市 天気 温度
札幌
雪
-1
 ~ 
2
 ℃
函館
くもり時々雪
くもり時々雪
0
 ~ 
4
 ℃
仙台
くもり
くもり
5
 ~ 
11
 ℃
新潟
雨
7
 ~ 
10
 ℃
東京
晴れ
晴れ
9
 ~ 
17
 ℃
名古屋
晴れ
晴れ
5
 ~ 
15
 ℃
大阪
晴れ時々くもり
晴れ時々くもり
7
 ~ 
15
 ℃
広島
晴れ時々くもり
晴れ時々くもり
7
 ~ 
14
 ℃
高知
晴れ時々くもり
晴れ時々くもり
5
 ~ 
16
 ℃
福岡
くもり
くもり
10
 ~ 
14
 ℃
那覇
晴れ
晴れ
19
 ~ 
24
 ℃
●在来線の運行情報(22:28現在)
エリア 路線
北海道 平常運転
東北 五能線
関東 平常運転
中部 北陸本線[金沢~直江津]
近畿 平常運転
中国 山陽本線[三原~岩国]芸備線呉線可部線
四国 平常運転
九州 日豊本線[小倉~延岡]
●為替と株の値動き(22:28現在)
・米ドル/円
116.55
    前日比
  +0.82(+0.71%)
 
・ユーロ/円
144.93
    前日比
  +0.54(+0.37%)
 
・ポンド/円
182.46
    前日比
  +0.62(+0.34%)
 
・豪ドル/円
101.20
    前日比
  +0.32(+0.31%)
 
 
・日経平均株価
17,490.83
    前日比
  +98.04(+0.56%)
●今日は何の日?
青函トンネルで北海道側の本坑の起工式(1971年)
 
●今日は誰の誕生日?
内山命、SKE48(1995年)
 

今日の出来事 – 2014年11月13日(木)

急上昇ワード今日の天気運行情報為替と株の値動き今日は何の日?
●急上昇ワード
順位 急上昇ワード
1
2
3
4
5
6
7
8
9
10
●今日の天気は?
都市 天気 温度
札幌
くもり時々雪
くもり時々雪
5
 ~ 
11
 ℃
函館
雪時々くもり
雪時々くもり
5
 ~ 
11
 ℃
仙台
くもり時々晴れ
くもり時々晴れ
10
 ~ 
15
 ℃
新潟
雨時々くもり
雨時々くもり
8
 ~ 
14
 ℃
東京
晴れ
晴れ
13
 ~ 
19
 ℃
名古屋
晴れ時々くもり
晴れ時々くもり
11
 ~ 
14
 ℃
大阪
くもりのち晴れ
くもりのち晴れ
10
 ~ 
15
 ℃
広島
くもり時々晴れ
くもり時々晴れ
8
 ~ 
14
 ℃
高知
晴れ時々くもり
晴れ時々くもり
10
 ~ 
15
 ℃
福岡
くもり
くもり
10
 ~ 
14
 ℃
那覇
くもり
くもり
20
 ~ 
22
 ℃
●在来線の運行情報(06:12現在)
エリア 路線
北海道 平常運転
東北 羽越本線
関東 平常運転
中部 平常運転
近畿 嵯峨野線
中国 平常運転
四国 平常運転
九州 平常運転
●為替と株の値動き(06:12現在)
・米ドル/円
115.54
    前日比
  -0.26(-0.22%)
 
・ユーロ/円
143.70
    前日比
  -0.76(-0.52%)
 
・ポンド/円
182.38
    前日比
  -1.94(-1.05%)
 
・豪ドル/円
100.70
    前日比
  +0.09(+0.08%)
 
 
・日経平均株価
17,197.05
    前日比
  +72.94(+0.43%)
●今日は何の日?
宮沢りえのヌード写真集『Santa Fe』が発売。150万部のベストセラーに(1991年)
 
●今日は誰の誕生日?
レナ・マロコ(1995年)
 

今日の出来事 – 2014年11月12日(水)

今日の天気運行情報為替と株の値動き今日は何の日?
●今日の天気は?
都市 天気 温度
札幌
晴れのち雨
晴れのち雨
5
 ~ 
13
 ℃
函館
晴れのち雨
晴れのち雨
5
 ~ 
14
 ℃
仙台
くもり時々晴れ
くもり時々晴れ
9
 ~ 
15
 ℃
新潟
晴れのち雨
晴れのち雨
9
 ~ 
18
 ℃
東京
くもりのち晴れ
くもりのち晴れ
13
 ~ 
18
 ℃
名古屋
くもりのち晴れ
くもりのち晴れ
13
 ~ 
20
 ℃
大阪
くもり時々晴れ
くもり時々晴れ
14
 ~ 
20
 ℃
広島
晴れ時々くもり
晴れ時々くもり
10
 ~ 
19
 ℃
高知
晴れ時々くもり
晴れ時々くもり
12
 ~ 
22
 ℃
福岡
くもり時々雨
くもり時々雨
14
 ~ 
18
 ℃
那覇
晴れのちくもり
晴れのちくもり
21
 ~ 
24
 ℃
●在来線の運行情報(06:30現在)
エリア 路線
北海道 平常運転
東北 平常運転
関東 中央線(快速)[東京~高尾]中央総武線(各停)
中部 平常運転
近畿 平常運転
中国 平常運転
四国 平常運転
九州 平常運転
●為替と株の値動き(06:30現在)
・米ドル/円
115.47
    前日比
  +0.64(+0.56%)
 
・ユーロ/円
144.05
    前日比
  +1.43(+1.00%)
 
・ポンド/円
183.82
    前日比
  +1.91(+1.05%)
 
・豪ドル/円
100.39
    前日比
  +1.42(+1.44%)
 
 
・日経平均株価
17,124.11
    前日比
  +343.58(+2.05%)
●今日は何の日?
サンフランシスコ・オークランド・ベイブリッジが開通(1936年)
g h T
 3,004 Total Views