从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
相关产品推荐
相关产品推荐

