Table des matières
Cause du problème
Solution
Méthode 1 : conversion de l'encodage GB18030
方法二:使用 reflect
方法三:使用 fileheader 和 FileInfo 中的 name 属性
Maison développement back-end Golang golang zip code chinois tronqué

golang zip code chinois tronqué

May 14, 2023 pm 10:35 PM

Avec la popularité continue et l'application de Golang dans le domaine du développement Web, les fichiers compressés Zip sont devenus un module fonctionnel indispensable. Cependant, certains développeurs ont rencontré un problème courant lors de l'utilisation du package Zip de Golang pour la compression de fichiers : les noms de fichiers chinois semblent tronqués.

Il s'agit d'un problème très gênant, car non seulement il donne un aspect indescriptible au beau nom du fichier à l'origine, mais il peut également provoquer une série d'autres erreurs. Ci-dessous, nous explorerons les causes et les solutions à ce problème.

Cause du problème

Le format Zip est un format binaire qui contient le nom du fichier, le répertoire du fichier, la méthode de compression et les données compressées. Parmi ces informations, le nom du fichier est un élément très critique, car il détermine le nom et le chemin de stockage du fichier après que l'utilisateur l'a décompressé.

Cependant, différents systèmes de fichiers et formats d'encodage peuvent entraîner des résultats d'analyse différents pour le même nom de fichier. Par exemple, sur les systèmes Windows, le codage par défaut utilisé pour les noms de fichiers est GBK, tandis que sur les systèmes UNIX/Linux, les noms de fichiers utilisent UTF-8. Si nous ne gérons pas ces différentes méthodes d'encodage lors de l'utilisation du package Zip dans Golang pour la compression, le nom du fichier peut être traité comme des caractères tronqués.

Solution

Nous avons une variété de solutions au problème des noms de fichiers chinois tronqués. Ci-dessous, nous présenterons certaines des méthodes les plus réalisables.

Méthode 1 : conversion de l'encodage GB18030

Étant donné que le format Zip utilise l'encodage CP437 pour représenter le nom de fichier, nous pouvons convertir le nom de fichier de l'encodage GB18030 en encodage CP437, garantissant ainsi que le fichier peut être correctement analysé dans n'importe quel nom d'environnement. Dans Go, vous pouvez utiliser le package golang.org/x/text/encoding/simplifiedchinese pour convertir entre l'encodage GB18030 et l'encodage CP437. golang.org/x/text/encoding/simplifiedchinese 包来进行 GB18030 编码和 CP437 编码的互转换。

import (
    "golang.org/x/text/encoding/simplifiedchinese"
    "golang.org/x/text/transform"
)

func GbkToUtf8(data []byte) ([]byte, error) {
    return transform.NewReader(bytes.NewReader(data), simplifiedchinese.GB18030.NewDecoder()).ReadAll()
}

func Utf8ToGbk(data []byte) ([]byte, error) {
    return transform.NewReader(bytes.NewReader(data), simplifiedchinese.GB18030.NewEncoder()).ReadAll()
}
Copier après la connexion

方法二:使用 reflect

我们还可以使用 reflect 包中的 StructTag 选项,强制使用指定的编码方式。具体可以在结构体中添加 zip 的 Tag,在 Tag 中加一个 chinese-utf8 的标签就可以了。示例代码如下:

type File struct {
    Name string `zip:"filename=测试文件,chinese-utf8"`
}

func main() {
    zhName := "测试文件"
    utf8Name, _ := GbkToUtf8([]byte(zhName))
    f := &File{Name: string(utf8Name)}
    // 压缩文件...
}
Copier après la connexion

方法三:使用 fileheader 和 FileInfo 中的 name 属性

在 Golang 的 Zip 包中,我们还可以通过调用 fileheaderFileInfoname

import "archive/zip"

func zipFiles(filePaths []string, dest string) error {
    // 创建文件
    newZipFile, err := os.Create(dest)
    if err != nil {
        return err
    }
    defer newZipFile.Close()

    // 创建 ZIP writer 对象
    zipWriter := zip.NewWriter(newZipFile)
    defer zipWriter.Close()

    // 遍历 filePaths,为每个文件设置正确的编码方式
    for _, filePath := range filePaths {
        zipFile, err := os.Open(filePath)
        if err != nil {
            return err
        }
        defer zipFile.Close()

        // 解析文件名,并转换编码
        zipFileInfo, _ := zip.FileInfoHeader(zipFile.Stat())
        zipFileInfo.Name, _ = GbkToUtf8([]byte(zipFileInfo.Name))

        // 创建 Zip 文件写入器
        zipWriterNewFile, err := zipWriter.CreateHeader(zipFileInfo)
        if err != nil {
            return err
        }

        // 读取文件并写入 Zip 文件中
        _, err = io.Copy(zipWriterNewFile, zipFile)
        if err != nil {
            return err
        }
    }

    return nil
}
Copier après la connexion
Méthode 2 : Utiliser Reflect

Nous pouvons également utiliser l'option StructTag dans le package reflect pour forcer l'utilisation de la méthode d'encodage spécifiée. Plus précisément, vous pouvez ajouter la balise zip à la structure et ajouter une balise chinese-utf8 à la balise. L'exemple de code est le suivant :

rrreee

Méthode 3 : Utilisez l'attribut name dans fileheader et FileInfo 🎜🎜Dans le package Golang Zip, nous pouvons également appeler fileheader et FileInfo Attribut name pour spécifier manuellement l'encodage correct pour chaque fichier. 🎜rrreee🎜Conclusion🎜🎜Pour le problème des noms de fichiers chinois tronqués, le package Zip de Golang propose une variété de solutions. Si le format de codage du nom de fichier n’est pas uniforme, il est facile que le nom de fichier soit tronqué. Nous pouvons facilement éviter ce problème en choisissant simplement la bonne solution en fonction de nos besoins. 🎜

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

Cet article explique les mécanismes d'importation des packages de Go: les importations nommées (par exemple, importation & quot; fmt & quot;) et les importations vierges (par exemple, importation _ & quot; fmt & quot;). Les importations nommées rendent le contenu du package accessible, tandis que les importations vierges ne font que l'exécuter t

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Cet article explique la fonction Newflash () de Beego pour le transfert de données inter-pages dans les applications Web. Il se concentre sur l'utilisation de NewFlash () pour afficher les messages temporaires (succès, erreur, avertissement) entre les contrôleurs, en tirant parti du mécanisme de session. Limiter

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Cet article détaille la conversion efficace de la requête MySQL Resulte en tranches de structure GO. Il met l'accent sur l'utilisation de la méthode de numérisation de la base de données / SQL pour des performances optimales, en évitant l'analyse manuelle. Meilleures pratiques pour la cartographie des champs struct à l'aide de balises DB et de robus

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Cet article détaille la rédaction de fichiers efficace dans GO, en comparant OS.WriteFile (adapté aux petits fichiers) avec OS.OpenFile et Buffered Writes (optimal pour les fichiers volumineux). Il met l'accent sur la gestion robuste des erreurs, l'utilisation de différer et la vérification des erreurs spécifiques.

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données

See all articles