遍历Unicode范围

时间:2018-06-25 11:11:04

标签: vb.net unicode

我想获取任意两个Unicode点之间的字符范围。

下面的内容在VB.NET中不起作用,也没有提供任何有关如何将其转换为使用Unicode的提示。

for (char c = 'A'; c <= 'Z'; c++)
{
    yield return c;
} 

The above is from here

转换后的样子:

For c As Char = "A"c To "Z"c
    Yield c
Next

但这会导致错误“ “ For”循环控制变量的类型不能为“ Char”,因为该类型不支持所需的运算符。

说我想获得Basic Latin,有什么办法可以像下面这样吗?

For c As Char = U+0000 To U+007F
    Yield c
Next

我正在努力寻找有关此特定主题的任何东西。

2 个答案:

答案 0 :(得分:2)

另一种方法是使用Enumerable.Range。这是单线纸:

Enumerable.Range(AscW("A"c), AscW("Z"c) - AscW("A"c) + 1).Select(Function(i) ChrW(i))

您可以将其放在这样的函数中:

Public Function CharRange(first As Char, last As Char) As IEnumerable(Of Char)
    Return Enumerable.Range(AscW(first), AscW(last) - AscW(first) + 1).Select(Function(i) ChrW(i))
End Function

对于Unicode版本,您需要使用Integers而不是Chars:

Public Function CharRange(first As Integer, last As Integer) As IEnumerable(Of Char)
    Return Enumerable.Range(first, last - first + 1).Select(Function(i) ChrW(i))
End Function

此外,现在我们有了 Integer版本,您可以将第一个函数替换为以下较短的版本:

Public Function CharRange(first As Char, last As Char) As IEnumerable(Of Char)
    Return CharRange(AscW(first), AscW(last))
End Function

示例用法:

'Dim combined As String = String.Join("", CharRange("A"c, "Z"c))
Dim combined As String = String.Join("", CharRange(&H41, &H5A))
Console.WriteLine(combined)

输出:

  

ABCDEFGHIJKLMNOPQRSTUVWXYZ

答案 1 :(得分:1)

不幸的是,VB.NET不像C#那样对待字符。字符实际上只是代表字母的数字(称为字符代码),因此对于计算机而言,实际上可以循环使用它们是有意义的。

但是,要使其在VB.NET中正常工作,必须先将char转换为整数才能在循环中使用它们,然后在每次迭代 back 中将整数转换为Char

For i As Integer = AscW("A"c) To AscW("Z"c)
    Dim c As Char = ChrW(i)
    Yield c
Next

对于第二个示例,Unicode代码点以U+####的形式表示。 ####部分是一个十六进制数字,可以用&H####的形式写在VB.NET中。对于编译器,十六进制数只是一个普通数,因此您所需要做的就是将循环更改为:

For i As Integer = &H0000 To &H007F
    Dim c As Char = ChrW(i)
    Yield c
Next