「C#.NET」文字コードの全知全能のEncodingクラスが LeftB RightB MidBの再現方法を伝授 UTF8 ShiftJISのサンプルコード解説

2024年11月19日火曜日

基本 文字列操作

t f B! P L

名前空間: System.Text

自己紹介

こんにちは、私は「Encoding」。文字のエンコードとデコードを司る女神なんだよ。文字コードを変えたり、文字列をバイナリにしたりするお仕事をしてるの。今日はEXCELのLeftB、RightB、MidBっぽい機能をC#でやる方法を教えるね!

初心者でもわかる文字エンコードとデコードの基本と実践

基本機能

Encodingクラスってね、文字列をエンコードしたりデコードしたりする魔法の道具なの。例えば、UTF-8やShift_JISみたいな文字コードの変換もお手の物!それぞれの文字が何バイトになるかも教えてくれるんだよ。

バイト数で文字列を切り取る方法

LeftBは文字列の先頭から指定したバイト数分だけ切り取るの。例えば、UTF-8で「こんにちは」を扱うとき、最初の3バイトを取ると「こ」だけ取れるの。

最後の部分をバイト数で切り取る方法

RightBは文字列の最後から指定したバイト数分を切り取る感じ!Shift_JISで「こんにちは」を扱うとき、最後の3バイトを取ると「は」になるの。文字コードによって結果が変わるから注意してね!

指定範囲をバイト数で切り取る方法

MidBは、文字列の真ん中を切り取る操作だよ!指定した開始位置から指定したバイト数を取るの。例えば、「世界中」をShift_JISで使うと「界」だけ取れたりするんだ。

文字コードの違いに注意しよう

UTF-8では1文字が3バイトになることもあるけど、Shift_JISだと2バイトだったりするの。これを間違えると切り取った結果が変になるから気を付けてね!

サンプルコード

C#
using System;
using System.Text;

class Program
{
    // バイト単位で文字列を切り取るメソッド (LEFTB)
    static string LeftB(string input, int byteCount, Encoding encoding)
    {
        // 文字列をバイト配列に変換
        byte[] bytes = encoding.GetBytes(input);
        if (bytes.Length <= byteCount)
            return input;

        // 指定バイト数で切り取る
        string result = encoding.GetString(bytes, 0, byteCount);

        // 切り取った部分が正しく読み取れない場合は半角スペースを追加
        if (encoding.GetByteCount(result) != byteCount)
            return encoding.GetString(bytes, 0, byteCount - 1) + " ";

        return result;
    }

    // バイト単位で文字列を切り取るメソッド (RIGHTB)
    static string RightB(string input, int byteCount, Encoding encoding)
    {
        // 文字列をバイト配列に変換
        byte[] bytes = encoding.GetBytes(input);
        if (bytes.Length <= byteCount)
            return input;

        // 末尾から指定バイト数を切り取る
        int startIndex = bytes.Length - byteCount;
        string result = encoding.GetString(bytes, startIndex, byteCount);

        // 切り取った部分が正しく読み取れない場合は半角スペースを追加
        if (encoding.GetByteCount(result) != byteCount)
            return " " + encoding.GetString(bytes, startIndex + 1, byteCount - 1);

        return result;
    }

    // バイト単位で文字列を切り取るメソッド (MIDB)
    static string MidB(string input, int startByte, int byteCount, Encoding encoding)
    {
        // 文字列をバイト配列に変換
        byte[] bytes = encoding.GetBytes(input);

        // 範囲外の場合は空文字を返す
        if (startByte >= bytes.Length)
            return "";

        // 指定された範囲内のバイトを取得
        int length = Math.Min(byteCount, bytes.Length - startByte);
        string result = encoding.GetString(bytes, startByte, length);

        // 切り取った部分が正しく読み取れない場合は半角スペースを追加
        if (encoding.GetByteCount(result) != length)
            return encoding.GetString(bytes, startByte, length - 1) + " ";

        return result;
    }

    static void Main()
    {
        // テスト用文字列
        string text = "こんにちは世界";

        // エンコーディング設定
        Encoding utf8 = Encoding.UTF8;
        Encoding shiftJis = Encoding.GetEncoding("Shift_JIS");

        // UTF-8でのテスト
        Console.WriteLine("UTF-8 LEFTB: " + LeftB(text, 6, utf8));
        Console.WriteLine("UTF-8 RIGHTB: " + RightB(text, 6, utf8));
        Console.WriteLine("UTF-8 MIDB: " + MidB(text, 3, 6, utf8));

        // Shift_JISでのテスト
        Console.WriteLine("Shift_JIS LEFTB: " + LeftB(text, 6, shiftJis));
        Console.WriteLine("Shift_JIS RIGHTB: " + RightB(text, 6, shiftJis));
        Console.WriteLine("Shift_JIS MIDB: " + MidB(text, 3, 6, shiftJis));
    }
}

解説

以下は、UTF-8とShift_JISを使って、LeftB、RightB、MidBのような操作をC#で実現するサンプルコードだよ。

このコードでは、UTF-8とShift_JISの文字列をバイト単位で切り取る方法を実演してるの。バイト数に基づいて切り取るときは、文字コードごとにバイト数が異なることに注意してね!

このブログを検索

QooQ