Maison  >  Article  >  développement back-end  >  Golang utilise des caractères tronqués

Golang utilise des caractères tronqués

WBOY
WBOYoriginal
2023-05-22 11:56:37754parcourir

Ces dernières années, le langage Go (Golang) est devenu de plus en plus largement utilisé dans le domaine du développement back-end, mais il est facile de rencontrer des caractères tronqués lors de son utilisation. Cet article explorera les raisons et les solutions pour rencontrer des personnages tronqués dans Golang.

1. Raisons du problème de code tronqué

1. Encodage incohérent

Les chaînes Golang utilisent l'encodage UTF-8 par défaut, tels que la lecture et l'écriture de bases de données et la lecture et l'écriture de fichiers, le format d'encodage peut être différent. de l'incohérence UTF-8 entraîne des problèmes de code tronqué.

Par exemple, lorsque nous lisons une chaîne codée en gbk dans la base de données, si nous la produisons directement en UTF-8, des caractères tronqués apparaîtront.

2. Correspondance des jeux de caractères

Le problème de correspondance des jeux de caractères dans Golang peut également conduire à des caractères tronqués. Le jeu de caractères Unicode contient des caractères provenant de nombreuses langues, mais si différents jeux de caractères sont utilisés, des incompatibilités de caractères se produiront, conduisant finalement à des caractères tronqués.

Par exemple, si nous devons écrire une chaîne avec des caractères chinois dans un fichier avec un jeu de caractères anglais, des caractères tronqués peuvent apparaître.

2. Solution au problème des caractères tronqués

1. Spécifiez le format d'encodage

Lors de la lecture de données externes et de l'écriture de données externes, nous pouvons spécifier le format d'encodage correspondant, ce qui peut éviter le problème d'encodage incohérent. Si nous lisons la chaîne codée en gbk dans la base de données, nous pouvons la convertir en une chaîne codée en UTF-8 et la sortir, comme indiqué ci-dessous :

import (
    "fmt"
    "github.com/axgle/mahonia"
)
 
func main() {
    // gbk编码字符串
    str := "你好"
    // 转换为UTF-8编码字符串
    enc := mahonia.NewDecoder("gbk")
    result := enc.ConvertString(str)
    fmt.Println(result)
}

Dans cet exemple, nous avons utilisé la bibliothèque tierce "mahonia", dont " NewDecoder" peut convertir une chaîne d'un format d'encodage vers un autre format d'encodage.

2. Utilisez la bibliothèque "unicode/utf8"

La bibliothèque "unicode/utf8" fournit de nombreuses opérations liées aux jeux de caractères, qui peuvent facilement gérer les problèmes de correspondance des jeux de caractères. Nous pouvons utiliser la méthode "utf8.RuneCountInString" pour obtenir le nombre de caractères dans une chaîne et éviter les incompatibilités de jeux de caractères lors de la comparaison.

Par exemple, lorsque nous devons écrire une chaîne contenant des caractères chinois dans un fichier avec un jeu de caractères anglais, nous pouvons d'abord utiliser la méthode "utf8.RuneCountInString" pour obtenir le nombre de caractères dans la chaîne, puis utiliser la méthode " io.WriteString". Écrivez, comme indiqué ci-dessous :

import (
    "io"
    "os"
    "unicode/utf8"
)
 
func main() {
    // 汉字字符串
    str := "你好"
    // 获取字符数量
    count := utf8.RuneCountInString(str)
    // 写入文件
    file, _ := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, 0644)
    defer file.Close()
    for _, r := range str {
        io.WriteString(file, string(r))
    }
}

Dans cet exemple, nous utilisons la méthode "utf8.RuneCountInString" pour obtenir le nombre de caractères dans "str", et lors du parcours de la chaîne, utilisons la méthode "io. WriteString" pour écrire .

3. Utilisez la bibliothèque "bufio"

La bibliothèque "bufio" fournit les types "Reader" et "Writer", qui peuvent lire et écrire des données à partir de fichiers ou de connexions réseau, et le format d'encodage peut être spécifié. L'utilisation de la bibliothèque « bufio » peut également éviter le problème des jeux de caractères incohérents, comme indiqué ci-dessous :

import (
    "bufio"
    "os"
)
 
func main() {
    // 打开文件
    file, _ := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, 0644)
    defer file.Close()
    // 以GBK编码写入数据
    writer := bufio.NewWriter(file)
    writer.WriteString("你好")
    writer.Flush()
    // 读取以GBK编码存储的数据
    file, _ = os.Open("test.txt")
    defer file.Close()
    // 读取数据
    reader := bufio.NewReader(file)
    str, _, _ := reader.ReadLine()
    fmt.Println(string(str))
}

Dans cet exemple, nous utilisons la bibliothèque « bufio » pour les opérations d'écriture et de lecture de fichiers, et spécifions l'encodage GBK lors de l'écriture du format.

Conclusion

Lors de la programmation en Golang, nous rencontrerons divers problèmes de codage, parmi lesquels les caractères tronqués sont particulièrement courants. Cet article présente les causes et les solutions au problème du code tronqué et espère être utile aux lecteurs. Afin d'éviter le problème des caractères tronqués, nous devons accorder une attention particulière à la correspondance du format d'encodage et du jeu de caractères pendant le processus d'encodage. Si nécessaire, nous pouvons utiliser la bibliothèque correspondante pour fonctionner.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:transfert nginx golangArticle suivant:transfert nginx golang