MST

星途 面试题库

面试题:Go中如何将UTF - 8编码的字符串转换为字节切片并处理可能的编码错误

在Go语言中,给定一个UTF - 8编码的字符串s,编写代码将其转换为字节切片。同时,考虑到字符串可能存在无效的UTF - 8编码,如何优雅地处理这种情况并返回有意义的错误信息。
37.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

func convertStringToBytes(s string) ([]byte, error) {
    if len(s) == 0 {
        return nil, fmt.Errorf("empty string")
    }
    // 尝试直接转换
    byteSlice := []byte(s)
    // 这里虽然Go语言中字符串底层是UTF - 8编码,可以直接转换为字节切片,
    // 但为了检测无效UTF - 8编码,需要使用如下方法
    for len(byteSlice) > 0 {
        r, size := rune(byteSlice[0]), 1
        if r < 0x80 {
            // 单字节字符
        } else if r < 0xE0 {
            size = 2
        } else if r < 0xF0 {
            size = 3
        } else if r < 0xF8 {
            size = 4
        } else {
            return nil, fmt.Errorf("invalid UTF - 8 encoding")
        }
        if len(byteSlice) < size {
            return nil, fmt.Errorf("invalid UTF - 8 encoding")
        }
        for i := 1; i < size; i++ {
            if byteSlice[i]&0xC0 != 0x80 {
                return nil, fmt.Errorf("invalid UTF - 8 encoding")
            }
        }
        byteSlice = byteSlice[size:]
    }
    return []byte(s), nil
}

你可以使用以下方式调用这个函数:

func main() {
    s := "hello世界"
    result, err := convertStringToBytes(s)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Byte slice:", result)
    }
}

上述代码定义了一个 convertStringToBytes 函数,该函数将UTF - 8编码的字符串转换为字节切片,并在遇到无效UTF - 8编码时返回有意义的错误信息。在 main 函数中,演示了如何调用这个函数。

  1. 转换逻辑
    • 首先检查字符串是否为空,如果为空,返回错误。
    • 由于Go语言字符串底层是UTF - 8编码,可以直接转换为字节切片 []byte(s)
    • 然后遍历字节切片,根据UTF - 8编码规则检查每个字符是否有效。如果发现无效字符,返回错误。
  2. 错误处理
    • 如果字符串为空,返回 empty string 错误。
    • 如果发现无效的UTF - 8编码,返回 invalid UTF - 8 encoding 错误。