Val*_*ria 6 string go inversion reversion
我正在尝试反转 go 中的字符串,但在处理字符时遇到问题。与 C 不同,GO 将字符串视为字节向量,而不是字符,这里称为符文。我尝试进行一些类型转换来完成作业,但到目前为止我还做不到。
这里的想法是生成 5 个字符串,其中随机字符大小为 100、200、300、400 和 500,然后反转它们的字符。我能够轻松地使 C 工作,但在 GO 中,该语言返回一个错误,指出无法执行分配。
func inverte() {
var c = "A"
var strs, aux string
rand.Seed(time.Now().UnixNano())
// Gera 5 vetores de 100, 200, 300, 400, e 500 caracteres
for i := 1; i < 6; i++ {
strs = randomString(i * 100)
fmt.Print(strs)
for i2, j := 0, len(strs); i2 < j; i2, j = i+1, j-1 {
aux = strs[i2]
strs[i2] = strs[j]
strs[j] = aux
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想考虑unicode 组合字符(旨在修改其他字符的字符,例如重音符号\xc2\xb4+ e= \xc3\xa9),Andrew Sellers对这个要点有一个有趣的看法。
首先列出所有组合变音标记 (CDM)的Unicode 块范围( 包含最常见组合字符的Unicode 块)
\nvar combining = &unicode.RangeTable{\n R16: []unicode.Range16{\n {0x0300, 0x036f, 1}, // combining diacritical marks\n {0x1ab0, 0x1aff, 1}, // combining diacritical marks extended\n {0x1dc0, 0x1dff, 1}, // combining diacritical marks supplement\n {0x20d0, 0x20ff, 1}, // combining diacritical marks for symbols\n {0xfe20, 0xfe2f, 1}, // combining half marks\n },\n}\nRun Code Online (Sandbox Code Playgroud)\n然后,您可以逐个符文地读取您的初始字符串:
\nsv := []rune(s)\nRun Code Online (Sandbox Code Playgroud)\n但是如果您以相反的顺序这样做,您将首先遇到组合变音标记(CDM) ,并且这些标记需要保留它们的顺序,以免被颠倒
\nsv := []rune(s)\nRun Code Online (Sandbox Code Playgroud)\n(注意组合符文周围的空格%c:\'%c\'没有空格意味着将标记与第一个\'\xcd\xa4\': 组合,而不是 \' \xcd\xa4 \'。我尝试使用CGJ Combining Grapheme Joiner \\u034F,但这不起作用)
如果您最终遇到常规符文,则需要与这些 CDM 结合,然后将其添加到反向最终符文阵列中。
\n } else {\n rrv := make([]rune, 0, len(cv)+1)\n rrv = append(rrv, r)\n rrv = append(rrv, cv...)\n fmt.Printf("regular mark \'%c\' (with \'%d\' combining diacritical marks \'%s\') => \'%s\'\\n", r, len(cv), string(cv), string(rrv))\n rv = append(rv, rrv...)\n cv = make([]rune, 0)\n }\nRun Code Online (Sandbox Code Playgroud)\n表情符号变得更加复杂,例如最近出现的修饰符,如中深肤色(菲茨帕特里克肤色等级上的第 5 类) 。
\n如果忽略,反向 \'\xe2\x80\x8d\xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f\' 将给出 \'\xef\xb8\x8f\xe2\x9a\x96\ xe2\x80\x8d\xe2\x80\x8d\',失去最后两个表情符号的肤色。
不要让我开始讨论零宽度连接器( 200D),它Wisdom/Awesome-Unicode强制将相邻字符连接在一起(例如,阿拉伯字符或支持的表情符号)。它可以用来组成顺序组合的表情符号。
以下是组合表情符号的两个示例,其内部元素顺序在“反转”时应保持相同的顺序:
\n\xe2\x80\x8d 单独是(从Unicode 到代码点转换器):
\n\n这些应该保持完全相同的顺序。
\n“字符”“法官”(意为“法官”语义值的抽象概念)可以用几个字形或一个字形来表示。
\n\xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f 实际上是一个组合字形(这里由两个表情符号组成),代表一位法官。该顺序不应颠倒。
\n下面的程序正确检测“零宽度连接器”,并且不会反转它组合的表情符号。
\n如果你检查该表情符号,你会发现它由以下部分组成:
同样,需要保留该序列顺序。
\n注意:实际判断表情符号 \xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f使用MAN (1F468),而不是Adult (1F9D1)(加上上面列出的其他字符:深色皮肤、ZWJ ,比例),因此被表示为一个字形,而不是一组字素。
\n含义:单个字形,“法官”的官方表情符号,需要将“man”与“scale”结合起来(产生一个字形 \xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f)而不是“成人”+“规模”。
\n后者“成人”+“比例”仍被视为“一个字符”:由于 ZWJ(零宽度连接器)的原因,您不能仅选择比例。
\n但是这个“字符”被表示为一个组合字形 \xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f,两个字形,每个字形通过代码点+字体具体书面表示相应的字素)
显然,使用第一个组合(“man”+“scale”)会产生更具表现力的字符 \xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f。
\n\n\n\n字形和拼字字符是相当具体的对象,从某种意义上说,它们对于普通用户\xe2\x80\x94非专家来说很熟悉,他们通常从第一次学习 \xe2\x80\ 时就被教导如何使用它们来工作x9cABCs\xe2\x80\x9d (当然,或者他们的书写系统中的等效项)。
\n然而,在信息系统领域,我们对字符有不同的理解:抽象字符,它们是给定系统内文本表示的最小单位。
\n
\n这些确实在两个重要意义上是抽象的:\n
\n- 首先,其中一些抽象字符可能不对应于拼字法中的任何具体内容,正如我们在上面的水平制表符的情况下看到的那样。
\n- 其次,具体的书写对象(字素和拼字字符)可以用不止一种方式由抽象字符表示,而不必以一对一的方式表示,正如我们在上面 \xe2\x80\ 的情况中看到的那样x9c\xc3\xb4\xe2\x80\x9d 由序列 <O, CIRCUMFLEX> 表示。
\n
然后:“从字素到代码点到字形”:
\n\n\n\n\n
\n- 字素是用户通常习惯于思考的单位。
\n- 然而,在计算机内,处理是根据字符完成的。
\n我们不\xe2\x80\x99 在字素和字形之间建立任何直接联系。
\n
\n由于我们在这里定义了这两个概念,因此它们之间没有直接联系。它们只能通过抽象人物间接联系起来。
\n这是一个需要掌握的关键点:抽象字符是其他元素相互关联的共同元素。
Go Playground中的完整示例。
\nReverse \'Hello, World\' => \'dlroW ,olleH\'\nReverse \'\xe2\x83\xa0\' => \'\xe2\x83\xa0\'\nReverse \'\xe2\x80\x8d\xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f\' => \'\xe2\x80\x8d\xe2\x9a\x96\xef\xb8\x8f\xe2\x80\x8d\'\nReverse \'a\xcd\xa4o\xcd\xa7i\xcd\xa4 \xc5\xa1\xcc\x81\xc5\xbe\xcc\x81\xca\x9f\xcc\x81\' => \'\xca\x9f\xcc\x81\xc5\xbe\xcc\x81\xc5\xa1\xcc\x81 i\xcd\xa4o\xcd\xa7a\xcd\xa4\'\nReverse \'H\xcc\x99\xcc\x96ell\xcd\x94o\xcc\x99\xcc\x9f\xcd\x9a\xcd\x8e\xcc\x97\xcc\xb9\xcc\xac \xcc\xafW\xcd\x9d\xcc\x96o\xcc\xa8\xcc\xac\xcc\x9e\xcc\x9crl\xcc\xa3\xcc\xa6\xcc\xa3\xcc\xaad\xcc\xb0\xcc\xb2\xcc\x97\xcd\x88\' => \'d\xcc\xb0\xcc\xb2\xcc\x97\xcd\x88l\xcc\xa3\xcc\xa6\xcc\xa3\xcc\xaaro\xcc\xa8\xcc\xac\xcc\x9e\xcc\x9cW\xcd\x9d\xcc\x96 \xcc\xafo\xcc\x99\xcc\x9f\xcd\x9a\xcd\x8e\xcc\x97\xcc\xb9\xcc\xacl\xcd\x94leH\xcc\x99\xcc\x96\'\nRun Code Online (Sandbox Code Playgroud)\n
正如您正确识别的那样,go 字符串是不可变的,因此您不能分配给给定索引处的符文/字符值。
\n\n必须在字符串中创建符文的副本并反转它们,而不是就地反转字符串,然后返回结果字符串。
\n\n例如(去游乐场):
\n\nfunc reverse(s string) string {\n rs := []rune(s)\n for i, j := 0, len(rs)-1; i < j; i, j = i+1, j-1 {\n rs[i], rs[j] = rs[j], rs[i]\n }\n return string(rs)\n}\n\nfunc main() {\n fmt.Println(reverse("Hello, World!"))\n // !dlroW ,olleH\n fmt.Println(reverse("Hello, \xe4\xb8\x96\xe7\x95\x8c!"))\n // !\xe7\x95\x8c\xe4\xb8\x96 ,olleH\n}\nRun Code Online (Sandbox Code Playgroud)\n\n由于 Unicode 的复杂性(例如,组合变音符号),这种方法存在问题),这种方法存在一些问题,但这将帮助您入门。
\n| 归档时间: |
|
| 查看次数: |
4419 次 |
| 最近记录: |