如果出于遗留原因必须使用Chr方法,最好将其用作普通方法。
如果您不想导入VisualBasic或想了解它的工作原理,Reflector提供了一个不错的代码示例:
public static char Chr(int CharCode)
{
char ch;
if ((CharCode < -32768) || (CharCode > 0xffff))
{
throw new ArgumentException(Utils.GetResourceString("Argument_RangeTwoBytes1", new string[] { "CharCode" }));
}
if ((CharCode >= 0) && (CharCode <= 0x7f))
{
return Convert.ToChar(CharCode);
}
try
{
int num;
Encoding encoding = Encoding.GetEncoding(Utils.GetLocaleCodePage());
if (encoding.IsSingleByte && ((CharCode < 0) || (CharCode > 0xff)))
{
throw ExceptionUtils.VbMakeException(5);
}
char[] chars = new char[2];
byte[] bytes = new byte[2];
Decoder decoder = encoding.GetDecoder();
if ((CharCode >= 0) && (CharCode <= 0xff))
{
bytes[0] = (byte) (CharCode & 0xff);
num = decoder.GetChars(bytes, 0, 1, chars, 0);
}
else
{
bytes[0] = (byte) ((CharCode & 0xff00) >> 8);
bytes[1] = (byte) (CharCode & 0xff);
num = decoder.GetChars(bytes, 0, 2, chars, 0);
}
ch = chars[0];
}
catch (Exception exception)
{
throw exception;
}
return ch;
}
对于ASCII字符,它只调用Convert.ToChar
,这相当于(char)CharCode
。第一件有趣的事情是调用Utils.GetLocaleCodePage
:
internal static int GetLocaleCodePage()
{
return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage;
}
虽然人们可能会认为它与
Encoding.Default
相同,但它创建的编码与当前线程的文化相关联,而不是系统。其余部分只是将代码填入数组并使用编码进行解码。
这种方法有一个主要的限制,在处理编码时通常都是如此 - 它严重依赖于当前区域设置,更改当前线程的文化会破坏所有ASCII之外的代码的转换。但是,如果
那就是你想做的事情,这里有一个粗略而简短的等效方法:
public static char Chr(int code)
{
var encoding = Encoding.GetEncoding(Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage);
return encoding.GetChars(BitConverter.GetBytes((ushort)code))[0];
}
这个方法缺少一些检查,特别是单字节和范围检查。
然后在VB.NET中有一个更简单、更好的方法 - ChrW用于Unicode:
public static char ChrW(int CharCode)
{
if ((CharCode < -32768) || (CharCode > 0xffff))
{
throw new ArgumentException(Utils.GetResourceString("Argument_RangeTwoBytes1", new string[] { "CharCode" }));
}
return Convert.ToChar((int) (CharCode & 0xffff));
}
这又回到了与
ToChar 相关的问题:
public static char ToChar(int value)
{
if ((value < 0) || (value > 0xffff))
{
throw new OverflowException(Environment.GetResourceString("Overflow_Char"));
}
return (char) value;
}
如您所见,ChrW 与普通的 char 转换一样...
除了负值!您知道,虽然字符代码必须适合两个字节,但它可能来自有符号或无符号短整型,因此该方法确保它是两种类型的正确数字。如果您想考虑这一点,只需执行 CharCode & 0xffff。
因此,正如您所看到的,Chr 就是 Encoding.GetChars,其中编码是当前线程的编码,而 ChrW 就是 (char)CharCode,除了这两个函数还处理负值。没有其他区别。
关于您问题的原始部分,您不能从 char 转换为 string,因为... 没有可能的转换。它们不互相继承,因此您无法进行强制转换,它们也没有任何用户定义的转换操作符,并且 string 不是原始值类型,因此也没有内置转换。VB.NET 可能允许您这样做,但总的来说,由于其古老版本,它允许更多更糟糕的事情。
简而言之,(char) 等同于 Chr 吗?仅对 ASCII 字符代码(0 到 127),否则
不是。如果当前编码和代码编码不同,则 Chr 停止工作,这很重要,如果您使用非 ASCII 字符。
if (oWordDoc.ActiveWindow.Selection.Text.EndsWith((char)7)
当我查看了很多帖子后,发现我的问题与其他人的相同。这就是我想要澄清并确保我理解正确的内容:如果想将其用作字符串,则必须始终进行字符串转换。 - ib11Chr()
?你是在翻译VB6的代码还是其他的东西吗?(char)7
表示:将一个整数值对65536取余,作为UTF-16码单元转换为UTF-16码单元所使用的自然数据类型(char
)。(string
是一个由UTF-16码单元计算的序列。) - Tom Blodget