2016-06-01 3 views
-1

Я создаю структуру данных для хранения одиночных символов Юникода, которые я могу затем сравнить.Хранить символы юникода в golang

два вопроса:

  1. Какие типы данных я могу использовать?

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

  2. Мне нужен способ, чтобы сравнить первый символ любых двух юникод строк. Есть ли простой способ сделать это? В основном, как получить первый символ юникода строки?

+0

Теперь я дал полный код, демонстрирующий это. – khrm

ответ

2

НЕТ: type Char rune.

Обратите внимание на «сравнение», это сложная вещь с Unicode. Хотя кодовые точки (rune с) легко сравнить численно (U + 0020 == U + 0020; U + 1234 < U + 2345), это может быть или не быть тем, что вы хотите получить в данном случае, комбинируя символы и то, что еще предлагает Unicode.

+0

Как мне получить доступ к первой руне строки юникода? –

+0

unicode/utf8.DecodeRune [InString]: https://golang.org/pkg/unicode/utf8/#DecodeRune и DecodeRuneInString – Volker

1
  1. Чтобы сравнить строки utf8, вам необходимо проверить их runevalue. Runevalue - значение int32 значения utf8. Используйте стандартный пакет «unicode/utf8». Pass «строку [0:]», чтобы получить первый символ

    test := "春节" 
        runeValue, width := utf8.DecodeRuneInString(test[0:]) 
        fmt.Println(runeValue,width) 
        fmt.Printf("%#U %d", runeValue, runeValue) 
    

Теперь вы можете сравнить runeValue первого символа две строки, используя == оператор

  1. Кроме того, необходимо хранить строку в строке, если вы хотите сохранить весь символ.

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

Полный код демонстрирует это:

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

0

От Volkers, ответ, мы можем просто использовать руну для сравнения.

  1. type Char rune
  2. получить первый символ Юникода мы можем просто сделать []rune(str)[0]
+0

Вам не нужно вводить рутину Char. Если вы не делаете [] Char (str) [0] – khrm

Смежные вопросы