web-dev-qa-db-ja.com

ルーン文字列から文字列に変換するGolang

次のコードがあります。runestringにキャストして出力することになっています。ただし、印刷すると未定義の文字が表示されます。バグの場所を特定できません。

package main

import (
    "fmt"
    "strconv"
    "strings"
    "text/scanner"
)

func main() {
    var b scanner.Scanner
    const a = `a`
    b.Init(strings.NewReader(a))
    c := b.Scan()
    fmt.Println(strconv.QuoteRune(c))
}
22
user3551708

これは、 Scanner.Scan() を使用してruneを読み取るためですが、他の処理を行うためです。 Scanner.Scan()は、tokensまたは_Scanner.Mode_ビットマスクによって制御される特別なトークンのrunesの読み取りに使用でき、特別な定数を返します。 _text/scanner_ パッケージであり、読み取りルーン自体ではありません。

単一のruneを読み取るには、代わりに Scanner.Next() を使用します。

_c := b.Next()
fmt.Println(c, string(c), strconv.QuoteRune(c))
_

出力:

_97 a 'a'
_

単一のrunestringに変換するだけの場合は、単純なタイプ 変換 を使用します。 runeは_int32_のエイリアスであり、整数をstringに変換します。

符号付きまたは符号なし整数値を文字列型に変換すると、整数のUTF-8表現を含む文字列が生成されます。

そう:

_r := rune('a')
fmt.Println(r, string(r))
_

出力:

_97 a
_

また、string値のルーンをループするには、単に_for ... range_コンストラクトを使用できます。

_for i, r := range "abc" {
    fmt.Printf("%d - %c (%v)\n", i, r, r)
}
_

出力:

_0 - a (97)
1 - b (98)
2 - c (99)
_

または、単にstring値を_[]rune_に変換できます。

_fmt.Println([]rune("abc")) // Output: [97 98 99]
_

utf8.DecodeRuneInString() もあります。

Go Playground の例を試してください。

注:

元のコード(Scanner.Scan()を使用)は次のように機能します。

  1. Scanner.Init() を呼び出して、モード(_b.Mode_)を_scanner.GoTokens_に設定します。
  2. "a"_からの)入力でScanner.Scan()を呼び出すと、_scanner.Ident_が有効なGo識別子であるため、_"a"_が返されます。

    _c := b.Scan()
    if c == scanner.Ident {
        fmt.Println("Identifier:", b.TokenText())
    }
    
    // Output: "Identifier: a"
    _
18
icza

私はパーティーに少し遅れていることを知っていますが、ここに文字列関数の[]ルーンがあります:

func runesToString(runes []rune) (outString string) {
    // don't need index so _
    for _, v := range runes {
        outString += string(v)
    }
    return
}

はい、名前付きの戻り値がありますが、行数を減らし、関数が短いだけなので、この場合は大丈夫だと思います

2
MarkJL