确定Go中的空格

时间:2015-03-13 17:20:01

标签: unicode go whitespace

来自documentation of Go's unicode package

  

func IsSpace

     

func IsSpace(r rune) bool

     

IsSpace报告符文是否是Unicode的White Space属性定义的空格字符;在Latin-1空间中,这是

     

'\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP).

     

间距字符的其他定义由类别Z和属性Pattern_White_Space设置。

我的问题是:Z类别和Pattern_White_Space设置“其他定义”是什么意思?这是否意味着调用unicode.IsSpace(),检查字符是否属于Z类别,并检查字符是否在Pattern_White_Space 中会产生不同的结果吗?如果是,那么是差异?为什么会有差异?

1 个答案:

答案 0 :(得分:1)

IsSpace函数将首先检查您的rune是否在Latin1字符空间中。如果是,它将使用您列出的空格字符来确定白色间距。

如果没有,则调用isExcludingLatinhttp://golang.org/src/unicode/letter.go?h=isExcludingLatin#L170),如下所示:

   170  func isExcludingLatin(rangeTab *RangeTable, r rune) bool {
   171      r16 := rangeTab.R16
   172      if off := rangeTab.LatinOffset; len(r16) > off && r <= rune(r16[len(r16)-1].Hi) {
   173          return is16(r16[off:], uint16(r))
   174      }
   175      r32 := rangeTab.R32
   176      if len(r32) > 0 && r >= rune(r32[0].Lo) {
   177          return is32(r32, uint32(r))
   178      }
   179      return false
   180  }

传入的*RangeTableWhite_Space,其外观如下所示:

http://golang.org/src/unicode/tables.go?h=White_Space#L6069

  6069  var _White_Space = &RangeTable{
  6070      R16: []Range16{
  6071          {0x0009, 0x000d, 1},
  6072          {0x0020, 0x0020, 1},
  6073          {0x0085, 0x0085, 1},
  6074          {0x00a0, 0x00a0, 1},
  6075          {0x1680, 0x1680, 1},
  6076          {0x2000, 0x200a, 1},
  6077          {0x2028, 0x2029, 1},
  6078          {0x202f, 0x202f, 1},
  6079          {0x205f, 0x205f, 1},
  6080          {0x3000, 0x3000, 1},
  6081      },
  6082      LatinOffset: 4,
  6083  }

要回答您的主要问题,IsSpace检查不仅限于Latin-1。

修改
为了澄清,如果您正在测试的字符不在Latin-1字符集中,则使用范围表查找。表中的Range16值表示16位数字的范围{Low,Hi,Stride}。 isExcludingLatin将使用该范围表子区域is16调用R16,并确定提供的rune是否落在{{1}索引之后的任何范围内(在这种情况下为4)。

所以,那就是检查这些范围:

LatinOffset

有以下的unicode代码点:

http://www.fileformat.info/info/unicode/char/1680/index.htm http://www.fileformat.info/info/unicode/char/2000/index.htm http://www.fileformat.info/info/unicode/char/2001/index.htm http://www.fileformat.info/info/unicode/char/2002/index.htm http://www.fileformat.info/info/unicode/char/2003/index.htm http://www.fileformat.info/info/unicode/char/2004/index.htm http://www.fileformat.info/info/unicode/char/2005/index.htm http://www.fileformat.info/info/unicode/char/2006/index.htm http://www.fileformat.info/info/unicode/char/2007/index.htm http://www.fileformat.info/info/unicode/char/2008/index.htm http://www.fileformat.info/info/unicode/char/2009/index.htm http://www.fileformat.info/info/unicode/char/200a/index.htm http://www.fileformat.info/info/unicode/char/2028/index.htm http://www.fileformat.info/info/unicode/char/2029/index.htm http://www.fileformat.info/info/unicode/char/202f/index.htm http://www.fileformat.info/info/unicode/char/205f/index.htm http://www.fileformat.info/info/unicode/char/3000/index.htm

以上所有都是“白色空间”