

C# .NET Framework 2.0での開発をしています。  
で文字列に対してUTF-8文字コードでバイト数を取得し、その値が設定したバイト数上限を上回った場合に末尾の文字を上限を下回るまで削除する処理を実現したいと考えています。  
以下のような手法を考えたのですが、文字列が大きさに比例してループの回数が多くなってしまうため、もっとc#の機能を利用した高速で安全な方法が無いかと検討しております。  
良い方法等がございましたらご教示いただけませんでしょうか？  
宜しくお願いいたします。

[code]

                string input = "バイト数制限処理をしたい文字列";
                UTF8Encoding utf8 = new UTF8Encoding(false ,true);
                int byteSize = utf8.GetByteCount(input);
                int maxByteSize = 15;
                string output = null;
                if (byteSize > maxByteSize)
                {
                    int i = 1;
                    while(true){
                        output = input.Substring(0, input.Length - i);
                        if (utf8.GetByteCount(output) < maxByteSize)
                        {
                            break;
                        }
                        i++;
                    }
                }
                else
                {
                    output = input;
                }
            }
    
[/code]


CC BY-SA 3.0
2016-07-07T14:50:51.233
27437
2016-07-07T15:10:29.483
10614
question
c#
文字コードUTF-8の文字列に対するバイト数制限処理について


一度 `byte[]` にエンコードし、目標のバイト数で切り詰めた後、半端なバイト列を無視してデコードするというのはどうでしょうか。

[code]

    string input = "バイト数制限処理をしたい文字列";
    int maxByteSize = 14; // あえてキリの悪い数字に変更しました
    Encoding encoding = Encoding.GetEncoding(65001,
        EncoderFallback.ExceptionFallback, // エンコード時のエラーは例外に
        new DecoderReplacementFallback("")); // デコード時のエラーは空文字列に置換
    
    bytes[] bytes = encoding.GetBytes(input);
    string output = encoding.GetString(bytes, 0, Math.Min(maxByteSize, bytes.Length));
    
[/code]


CC BY-SA 3.0
2016-07-07T15:10:29.483
27439
2016-07-07T15:10:29.483
8000
27437
answer