在golang中存储unicode字符

时间:2016-06-01 04:51:56

标签: string go unicode

我正在创建一个用于存储单个unicode字符的数据结构,然后我可以进行比较。

两个问题:

  1. 我使用哪种数据类型?

    type ds struct { char Char // What should Char be so that I can safely compare two ds? }

  2. 我需要一种比较任意两个unicode字符串的第一个字符的方法。有一个简单的方法吗?基本上,我如何检索字符串的第一个unicode字符?

3 个答案:

答案 0 :(得分:2)

像这样:def parent(child): .. | objects | select( .Origins.Items[]? | .Id == child) | .Id ;

注意"比较",这对Unicode来说是一件复杂的事情。虽然代码点(type Char rune s)很容易在数字上进行比较(U + 0020 == U + 0020; U + 1234< U + 2345),但这可能是也可能不是您想要的情况,组合字符和Unicode提供的其他内容。

答案 1 :(得分:1)

  1. 要比较utf8字符串,您需要检查其符文值。 Runevalue是utf8字符的int32值。使用标准包“unicode / utf8”。传递“string [0:]”以获取第一个字符

        test := "春节"
        runeValue, width := utf8.DecodeRuneInString(test[0:])
        fmt.Println(runeValue,width)
        fmt.Printf("%#U %d", runeValue, runeValue)
    
  2. 现在您可以使用==运算符

    比较两个字符串的第一个字符的runeValue
    1. 如果要存储整个字符,还需要将字符串存储在字符串中。

      type ds struct {
          char string // What should Char be so that I can safely compare two ds?
      }
      
    2. 完整的代码证明了这一点:

      package main
      
      import (
          "fmt"
          "unicode/utf8"
      )
      
      type ds struct {
          char string // What should Char be so that I can safely compare two ds?
      }
      
      func main() {
          fmt.Println("Hello, playground")
      
          ds1 := ds{"春节"}
          ds2 := ds{"春节"}
      
          runeValue1, _ := utf8.DecodeRuneInString(ds1.char[0:])
          runeValue2, _ := utf8.DecodeRuneInString(ds2.char[0:])
      
          fmt.Printf("%#U %#U", runeValue1, runeValue2)
      
          if runeValue1 == runeValue2 {
              fmt.Println("\nFirst Char Same")
          } else {
              fmt.Println("\nDifferent")
          }
      }
      

      Golang Playground

答案 2 :(得分:0)

从沃尔克斯回答,我们可以用符文来比较。

  1. type Char rune
  2. 获取第一个unicode字符,我们可以简单地[]rune(str)[0]