怎样知道string输出到控制台后所占的长度,包括tab展开为空格后所占的空间加上其他多字节的字符 本帖最后由 qq13833254607 于 2012-08-07 12:18:13 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将字符串转为字节数组,数组长度就是实际长度Encoding.Default.GetBytes("aa这个"); 这个不行。Encoding.Default.GetByteCont()通常用来计算带中文字符串实际输出长度。(这其实是利用了中文显示的特点:通常的输出环境下,中文字符的输出宽度是英文的2倍。而中文的Unicode也是2字节的(英文字母是1字节)),但是'\t'是控制符,对应的也是1Byte,因此Encoding.Default.GetByteCount("a\tb")返回的仍然是3。 严格的说,LZ的需求其实是不能实现的。因为字符串"a\tb"实际输出的只有'a'、'\t'、'b'三个字符,其中控制符\t在ASCII中的定义为“制表符”,即“将输出位置移到下一个制表位”。而每个制表位的大小在不同的显示环境下可能会有不同的定义。例如,在cmd(严格点说应该是DOS7)和notepad下,每个制表位长度为8,而在VS的编辑器下默认的制表位长度为4。但如果只限定在控制台(DOS7)下,知道制表位长度为8以后可以自己编程计算其输出长度:(在下偷懒,只处理了\t的\n两种控制符,如果LZ有兴趣可以自己补充其它常见控制符如\a,\b,\r等的处理代码) class Program { const int TABCOUNT = 8; static void Main(string[] args) { string s = "a\tb\nabc\t123"; Console.WriteLine(s); Console.WriteLine(GetOutputCount(s)); } static int GetOutputCount(string str) { int count = 0; foreach (char ch in str) { switch (ch) { case '\t': count = TABCOUNT * (count / TABCOUNT + 1); break; case '\n': count = 0; break; default: count += Encoding.Default.GetByteCount(ch.ToString()); break; } } return (count); } } 仔细想了下确实实现不了,因为tab的扩展是和当前的光标位置相关的,单从一个字符串里得不到这个信息 求教各位大神一个问题 关于listview ScriptManager.RegisterStartupScript()问题 如何使用网上现成的C#自动更新 超级难题如何解析HTML中的JS,不是非常高手勿进 xml操作! 在线等,急 如何把RichTextBox格式解析成XML 如何获得textbox的插入符号的位置 反了,真的要反了! [求救] C#连接Oracle9i数据库出现的问题 调用系统API函数 mciSendString 及GetShortPathName 实现在声音播放后,怎样检测到声音是否播完? 泛型转换的问题,求解释
Encoding.Default.GetBytes("aa这个");
(这其实是利用了中文显示的特点:通常的输出环境下,中文字符的输出宽度是英文的2倍。而中文的Unicode也是2字节的(英文字母是1字节)),但是'\t'是控制符,对应的也是1Byte,因此
Encoding.Default.GetByteCount("a\tb")返回的仍然是3。
(在下偷懒,只处理了\t的\n两种控制符,如果LZ有兴趣可以自己补充其它常见控制符如\a,\b,\r等的处理代码)
class Program
{
const int TABCOUNT = 8; static void Main(string[] args)
{
string s = "a\tb\nabc\t123"; Console.WriteLine(s);
Console.WriteLine(GetOutputCount(s));
} static int GetOutputCount(string str)
{
int count = 0; foreach (char ch in str)
{
switch (ch)
{
case '\t':
count = TABCOUNT * (count / TABCOUNT + 1);
break;
case '\n':
count = 0;
break;
default:
count += Encoding.Default.GetByteCount(ch.ToString());
break;
}
} return (count);
}
}