整个代码是这样的:
var inputStream :NSInputStream?
var outputStream:NSOutputStream?
NSStream.getStreamsToHostWithName(ip, port: port, inputStream: &inputStream, outputStream: &outputStream)
let reader = inputStream
let writer = outputStream
writer?.open()
reader?.open()
var message : UInt8 = 0
while reader!.read(&message, maxLength: 1)>0
{
let wa = NSString(bytes: &message, length: 1, encoding: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue))) as! String
}
当我收到的消息是中文字符时,最后一行抛出: 致命错误:在展开可选值时意外发现nil,同时消息的值为196
有人知道如何解决这个问题吗?
答案 0 :(得分:0)
根据this page,如果您读取的字节在0x81-0xfe范围内,则使用两个或四个字节对字符进行编码,因此尝试仅解码第一个字节将失败。 NSString
构造函数将返回nil,并且尝试解包它(使用as! String
)将抛出该错误。
您需要检查您读取的字节,并根据第一个字节在必要时读取另一个字节。然后你需要检查第二个字节,并可能再读取两个字节。最后,您需要将所有一个,两个或四个字节传递给单个缓冲区中的NSString
构造函数。
答案 1 :(得分:0)
尝试更改inputData的message
类型,例如:
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {
let bufferSize = 1024
var message = Array<UInt8>(count:bufferSize, repeatedValue: 0)
while true {
let bytesRead = self.inputStream!.read(&message, maxLength: bufferSize)
let responseString = NSString(bytes: message, length: message.count, encoding: NSUTF8StringEncoding) as! String
// Do somthing with response
...
}
}