确保UTF-8编码的字符串适合2048字节

bmt*_*033 0 c# string unicode encoding utf-8

我正在编写一个C#/ WinForms应用程序,其中包含一个包含2,000行的DataGridView.我的用户会在这些行中输入字符串.字符串可以是任何语言,但最可能的两种语言是英语和阿拉伯语.我没有明确限制字符串中的最大字符数本身,但我所拥有的是每个字符串写入磁盘时存储的限制为2048字节.如果生成的字节数组小于2048字节,我需要用空字符填充它.我假设UTF-8可能是存储这些字符串的最有效编码?如果是这样,那么我认为在允许存储字符串之前我会做这样的事情:

byte[] stringAsBytes = System.Text.Encoding.UTF8.GetBytes(myString);
if (stringAsBytes.Length > 2048)
{
    // string is too long to be stored in 2048 bytes
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,因为UTF-8是一个可变长度编码,给定字符串中的最大字符数将取决于构成字符串语言的字符的代码点范围?如果这是正确的,我是否真的需要为每个按键操作执行类似上面的代码,以确定字符串何时超出最大存储大小?

spe*_*der 5

不,您可以使用以下代码:

var encoding=Encoding.UTF8;
var requiredBytes=encoding.GetByteCount("hello world!");
Run Code Online (Sandbox Code Playgroud)

或者,您可以将字符串长度限制为

2048 / encoding.GetMaxByteCount(1)
Run Code Online (Sandbox Code Playgroud)

这将保证您的编码的所有字符串适合缓冲区.不幸的是,这只是UTF8的341个字符.

  • 将这两种方法结合起来可能是有意义的.如果字符串小于2048/encoding.GetMaxByteCount(1)那么您将保证安全.但是,如果它更多,那么您可以使用GetByteCount方法来获得精确计数. (4认同)
  • 我得到682作为最大数量的`char`s(UTF-16代码单元),当UTF-8编码时,它们保证适合2048字节.或者,如果您使用代码点进行测量,那么使用UTF-8可以保证512符合2048字节. (2认同)