Utf 8 需要使用“翻译”来翻译代码;exp/utf8string";转换为以后的标准库代码

Utf 8 需要使用“翻译”来翻译代码;exp/utf8string";转换为以后的标准库代码,utf-8,go,Utf 8,Go,我试着运行一个例子——这本书是在2012年基于Go 1.0编写的。该示例使用exp/utf8string包,该包现在已成为unicode/utf8。我目前使用的是Go 1.2.1,下面列出的代码不会按原样编译,因为exp/utf8string包现在已失效: package main import "strings" import "unicode" import "exp/utf8string" import "fmt" func main() { str := "\tthe impo

我试着运行一个例子——这本书是在2012年基于Go 1.0编写的。该示例使用
exp/utf8string
包,该包现在已成为
unicode/utf8
。我目前使用的是Go 1.2.1,下面列出的代码不会按原样编译,因为
exp/utf8string
包现在已失效:

package main
import "strings"
import "unicode"
import "exp/utf8string"
import "fmt"

func main()
{
    str := "\tthe important rôles of utf8 text\n"
    str = strings.TrimFunc(str, unicode.IsSpace)

    // The wrong way
    fmt.Printf("%s\n", str[0:len(str)/2])
    // The right way
    u8 := utf8string.NewString(str)
    FirstHalf := u8.Slice(0, u8.RuneCount()/2)
    fmt.Printf("%s\n", FirstHalf)

}
我还是一个GoLang新手,所以我不确定旧的实验包是如何集成到标准库中的。我做了一些研究,发现
utf8string.NewString(str)
现在是
expvar.NewString(str)
,所以我将导入更改为

expvar
unicode
并对代码进行了适当修改,以调用
expvar.NewString(str)
,但仍然出现两个错误:

u8.Slice undefined (type *expvar.String has no field or method Slice)
u8.RuneCount undefined (type *expvar.String has no field or method RuneCount)
我试过几种不同的方法,但似乎都没能奏效


如何为GoLang 1.2.1编写此示例代码?

只需使用UTF8包()

  • utf8.RUNECOUNTING-
这个例子非常奇怪,因为不需要调用“NewString”来创建UTF8字符串。默认情况下,Go中的所有字符串都是UTF8

我建议找另一个资源,因为那本短语手册似乎太过时了,会产生误导


试试“以身作则”和“前进之路”

只需使用UTF8包()

  • utf8.RUNECOUNTING-
这个例子非常奇怪,因为不需要调用“NewString”来创建UTF8字符串。默认情况下,Go中的所有字符串都是UTF8

我建议找另一个资源,因为那本短语手册似乎太过时了,会产生误导


试试“以身作则”和“前进之路”

安装软件包
utf8string

$ go get -v code.google.com/p/go.exp/utf8string
code.google.com/p/go.exp (download)
code.google.com/p/go.exp/utf8string
$
修复程序:

package main

import (
    "fmt"
    "strings"
    "unicode"

    "code.google.com/p/go.exp/utf8string"
)

func main() {
    str := "\tthe important rôles of utf8 text\n"
    str = strings.TrimFunc(str, unicode.IsSpace)

    // The wrong way
    fmt.Printf("%s\n", str[0:len(str)/2])
    // The right way
    u8 := utf8string.NewString(str)
    FirstHalf := u8.Slice(0, u8.RuneCount()/2)
    fmt.Printf("%s\n", FirstHalf)
}
输出:

the important r
the important rô
the important r
the important rô
将程序修改为仅使用Go 1.2.1标准包:

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := "\tthe important rôles of utf8 text\n"
    str = strings.TrimSpace(str)

    // The wrong way
    fmt.Printf("%s\n", str[0:len(str)/2])
    // The right way
    r := []rune(str)
    FirstHalf := string(r[:len(r)/2])
    fmt.Printf("%s\n", FirstHalf)
}
输出:

the important r
the important rô
the important r
the important rô

安装程序包
utf8string

$ go get -v code.google.com/p/go.exp/utf8string
code.google.com/p/go.exp (download)
code.google.com/p/go.exp/utf8string
$
修复程序:

package main

import (
    "fmt"
    "strings"
    "unicode"

    "code.google.com/p/go.exp/utf8string"
)

func main() {
    str := "\tthe important rôles of utf8 text\n"
    str = strings.TrimFunc(str, unicode.IsSpace)

    // The wrong way
    fmt.Printf("%s\n", str[0:len(str)/2])
    // The right way
    u8 := utf8string.NewString(str)
    FirstHalf := u8.Slice(0, u8.RuneCount()/2)
    fmt.Printf("%s\n", FirstHalf)
}
输出:

the important r
the important rô
the important r
the important rô
将程序修改为仅使用Go 1.2.1标准包:

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := "\tthe important rôles of utf8 text\n"
    str = strings.TrimSpace(str)

    // The wrong way
    fmt.Printf("%s\n", str[0:len(str)/2])
    // The right way
    r := []rune(str)
    FirstHalf := string(r[:len(r)/2])
    fmt.Printf("%s\n", FirstHalf)
}
输出:

the important r
the important rô
the important r
the important rô

我发现这本书本身非常好——深邃而简洁,这是我第一次遇到一个例子的问题,我几乎完成了一半。(我有一本“Way to Go”-很好,但这是一本厚厚的书。)我相信作者在另一个地方解释说,复制字符串进行操作是一种很好的做法(我不太明白为什么…),我相信这就是调用
NewString()
的原因。无论如何,我已经尝试了
utf8.runecounnstring()
,但仍然得到
Slice undefined
检查包文档:没有Slice函数。查看
字符串
包中的拆分。还要注意,u8.Split不起作用:Split不是一种方法(请阅读方法接收者的官方文档)。默认情况下会复制所有字符串。
Slice()
对我来说听起来很奇怪。也许是旧实验包里的东西。我不认为
Split()
是需要的。我明白了这个例子的要点:按符文计数,而不是按字节计数——实际上不需要编译它。但是我喜欢建立一个例子,然后修改它——也许这次我会跳过它。我发现这本书本身很好——深刻而简洁,这是我第一次遇到一个例子的问题,我几乎完成了一半。(我有一本“Way to Go”-很好,但这是一本厚厚的书。)我相信作者在另一个地方解释说,复制字符串进行操作是一种很好的做法(我不太明白为什么…),我相信这就是调用
NewString()
的原因。无论如何,我已经尝试了
utf8.runecounnstring()
,但仍然得到
Slice undefined
检查包文档:没有Slice函数。查看
字符串
包中的拆分。还要注意,u8.Split不起作用:Split不是一种方法(请阅读方法接收者的官方文档)。默认情况下会复制所有字符串。
Slice()
对我来说听起来很奇怪。也许是旧实验包里的东西。我不认为
Split()
是需要的。我明白了这个例子的要点:按符文计数,而不是按字节计数——实际上不需要编译它。但是我喜欢构建一个示例,然后对其进行修补-也许这次我会跳过它。所以你的意思是,我仍然可以安装不推荐的包
exp/utf8string
,并按原样编译该示例代码,即使使用1.2.1标准包的修订版不再需要它。我不需要用老方法来做,用你做的方法来使用1.2.1很好。不管怎样,教训都是一样的:计算符文,而不是字节。所以你的意思是,我仍然可以安装不推荐的包
exp/utf8string
,并按原样编译示例代码,即使使用1.2.1标准包的修订版不再需要它。我不需要用老方法来做,用你做的方法来使用1.2.1很好。不管怎样,教训都是一样的:计算符文,而不是字节。