首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go 1.18中,不推荐使用strings.Title()。现在用什么?又是如何做到的?

在Go 1.18中,不推荐使用strings.Title()。现在用什么?又是如何做到的?
EN

Stack Overflow用户
提问于 2022-03-25 17:09:51
回答 4查看 7.5K关注 0票数 12

正如建议的那样,这里人名应该像John William Smith那样大写。

我正在用Golang编写一个小软件,它从用户的表单输入中获得姓和名。

在1.18之前,我使用的是:

代码语言:javascript
复制
lastname = strings.Title(strings.ToLower(strings.TrimSpace(lastname)))
firstname = strings.Title(strings.ToLower(strings.TrimSpace(firstname)))

它可以工作,但现在使用1.18 strings.Title()

他们建议改用golang.org/x/text/cases

所以我想我应该把我的代码修改成这样:

代码语言:javascript
复制
caser := cases.Title(language.Und)

lastname = caser.Title(strings.ToLower(strings.TrimSpace(lastname)))
firstname = caser.Title(strings.ToLower(strings.TrimSpace(firstname)))

和以前一样。

区别在于像ijsland这样的荷兰语,它的标题应该是IJsland,而不是Ijsland

问题是

在行caser := cases.Title(language.Und)中,我使用Und,因为我不知道要使用什么语言标记

我应该使用language.Englishlanguage.AmericanEnglish或其他吗?

到目前为止,就像strings.Title()在使用UndEnglish一样

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-31 19:31:02

正如文档中提到的,不推荐使用strings.Title,您应该使用cases.Title

弃用:用于字界的规则标题不能正确处理Unicode标点符号。改用golang.org/x/text/case。

下面是如何从两个角度使用它的示例代码:

代码语言:javascript
复制
// Straightforward approach
caser := cases.Title(language.BrazilianPortuguese)
titleStr := caser.String(str)

// Transformer interface aware approach
src := []byte(s)
dest := []byte(s) // dest can also be `dest := src`
caser := cases.Title(language.BrazilianPortuguese)
_, _, err := caser.Transform(dest, src, true)

确保查看transform.Transformer.Transformcases.Caser,以便了解每个参数和返回值的含义以及工具的局限性。例如:

Caser可能是有状态的,因此不应该在goroutines之间共享。

关于使用什么language,您应该知道它们在结果上的差异,除此之外,您应该对任何选择都很满意。这里有一份来自煎鱼关于差异的总结的副本,它为我清除了它:

围棋游乐场:https://go.dev/play/p/xp59r1BkC9L

代码语言:javascript
复制
func main() {
    src := []string{
        "hello world!",
        "i with dot",
        "'n ijsberg",
        "here comes O'Brian",
    }
    for _, c := range []cases.Caser{
        cases.Lower(language.Und),
        cases.Upper(language.Turkish),
        cases.Title(language.Dutch),
        cases.Title(language.Und, cases.NoLower),
    } {
        fmt.Println()
        for _, s := range src {
            fmt.Println(c.String(s))
        }
    }
}

具有以下输出

代码语言:javascript
复制
hello world!
i with dot
'n ijsberg
here comes o'brian

HELLO WORLD!
İ WİTH DOT
'N İJSBERG
HERE COMES O'BRİAN

Hello World!
I With Dot
'n IJsberg
Here Comes O'brian

Hello World!
I With Dot
'N Ijsberg
Here Comes O'Brian
票数 8
EN

Stack Overflow用户

发布于 2022-03-25 20:10:11

到目前为止,strings.Title()使用的是Und还是English

strings.Title() works 基于ASCII,其中cases.Title()基于Unicode工作,因此无法获得完全相同的行为。

我应该使用language.English或language.AmericanEnglish或其他吗?

language.Englishlanguage.AmericanEnglishlanguage.Und似乎都拥有相同的标题规则。使用它们中的任何一个都可以使您得到与原始strings.Title()行为最接近的信息,就像您将要得到的那样。

在Unicode支持下使用此包的全部要点是,它在客观上更正确。因此,选择一个适合您的用户的标签。

票数 4
EN

Stack Overflow用户

发布于 2022-06-04 14:25:32

不建议使用strings.Title(str),应该改为cases.Title(language.Und, cases.NoLower).String(str)

代码语言:javascript
复制
package main
import (
    "fmt"
    "strings"
    "golang.org/x/text/cases"
    "golang.org/x/text/language"
)
func main() {
    fmt.Println(strings.Title("abcABC"))                                   // AbcABC
    fmt.Println(cases.Title(language.Und, cases.NoLower).String("abcABC")) // AbcABC
}

操场:https://go.dev/play/p/i0Eqh3QfxTx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71620717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档