You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Go语言调用Objective-C函数时的UTF-8字符串处理问题

解决Go调用Objective-C时UTF-8字符串乱码问题

这个问题的核心是Objective-C的NSLog用%s格式符处理C字符串时,没有明确按UTF-8编码解析,导致你的中文出现乱码。下面给你两种解决方案,从简单到进阶:

方案一:在Objective-C函数内将UTF-8字符串转为NSString

这是最直接的修复方式,不需要改动Go层的代码,只需要修改你的Objective-C函数:

package main
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>
void printUTF8(const char * iconPath) {
    // 把UTF-8编码的C字符串转为NSString对象
    NSString *utf8String = [NSString stringWithUTF8String:iconPath];
    // 用%@输出NSString(Objective-C的字符串格式符)
    NSLog(@"%@", utf8String);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)
func main() {
    goString := "test 漢字 test\n"
    fmt.Print(goString)
    cString := C.CString(goString)
    defer C.free(unsafe.Pointer(cString))
    C.printUTF8(cString)
}

为什么这样能解决问题?

  • Go的C.CString会把Go的UTF-8字符串正确转为C的char*
  • [NSString stringWithUTF8String:]专门用来从UTF-8编码的C字符串创建NSString对象,Objective-C的NSString是原生支持Unicode的类型
  • NSLog的%@格式符会正确输出NSString的内容,不会出现编码混乱

方案二:在Go中直接创建NSString*传递(进阶)

如果你需要在Go层直接生成NSString对象并传递给Objective-C函数,可以在C层写辅助函数:

package main
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>

// 辅助函数:从UTF-8 C字符串创建NSString
NSString* createNSString(const char *utf8Str) {
    return [NSString stringWithUTF8String:utf8Str];
}

// 直接接收NSString参数的打印函数
void printNSString(NSString *str) {
    NSLog(@"%@", str);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)
func main() {
    goString := "test 漢字 test\n"
    fmt.Print(goString)
    cString := C.CString(goString)
    defer C.free(unsafe.Pointer(cString))
    // 创建NSString对象
    nsString := C.createNSString(cString)
    // 传递给Objective-C函数打印
    C.printNSString(nsString)
}

注意事项

  • 如果你使用的是手动引用计数(MRC)环境,需要记得对创建的NSString调用release;如果是ARC(默认)则不需要
  • 永远记得用defer C.free(unsafe.Pointer(cString))释放C.CString创建的内存,避免内存泄漏

内容的提问来源于stack exchange,提问作者learning_go

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:37:53