【问题标题】:How to copy a wchar_t into an NSString?如何将 wchar_t 复制到 NSString 中?
【发布时间】:2011-02-06 08:10:50
【问题描述】:

我正在使用 stringWithFormat @"%ls" 来执行此操作,但我只看到第一个字符被复制,这让我觉得它仍然假设它是一个单字节字符。

有什么想法吗?

【问题讨论】:

    标签: iphone nsstring wchar-t


    【解决方案1】:

    使用initWithBytes:length:encoding。您必须知道wchar_t 使用的编码,我相信它在Apple 平台上是UTF-32。

    #if defined(__BIG_ENDIAN__)
    # define WCHAR_ENCODING NSUTF32BigEndianStringEncoding
    #elif defined(__LITTLE_ENDIAN__)
    # define WCHAR_ENCODING NSUTF32LittleEndianStringEncoding
    #endif
    
    [[NSString alloc] initWithBytes:mystring
        length:(mylength * 4) encoding:WCHAR_ENCODING]
    

    一般来说,我建议尽可能避免使用wchar_t,因为它不是很便携。特别是,您应该如何弄清楚它使用什么编码? (在 Windows 上是 UTF-16LE 或 UTF-16BE,在 OS X、Linux 和 iOS 上是 UTF-32LE 或 UTF-32BE)。

    【讨论】:

      【解决方案2】:

      以下代码对我有用:

      NSString *pStr = [NSString stringWithFormat:@"%S", GetTCHARString()];
      

      注意“%S”部分。这完全不同。

      【讨论】:

      • 许多搜索将我引到这里。因此更新了答案。
      • GetTCHARString() 看起来很Windows。这应该代表 wchar_t * 吗?
      【解决方案3】:

      Foundation Constants Reference来看,我认为函数NSHostByteOrder()是正确的做法:

      @import Foundation;
      
      NSString * WCHARToString(wchar* wcharIn){
          if (NSHostByteOrder() == NS_LittleEndian){
              return [NSString stringWithCString: (char *)wcharIn encoding:NSUTF32LittleEndianStringEncoding];
          }
          else{
              return [NSString stringWithCString: (char *)wcharIn encoding:NSUTF32BigEndianStringEncoding];
          }
      }
      wchar_t * StringToWCHAR(NSString* stringIn)
      {
          if (NSHostByteOrder() == NS_LittleEndian){
              return (wchar_t *)[stringIn cStringUsingEncoding:NSUTF32LittleEndianStringEncoding];
          }
          else{
              return (wchar_t *)[stringIn cStringUsingEncoding:NSUTF32BigEndianStringEncoding];
          }
      }
      

      最好将它们放在 NSString 类别中。

      【讨论】:

        【解决方案4】:

        为了解决这个任务,我这样做了:

        @interface NSString ( WCarToString )
        - (NSString*) getStringFromWChar:(const wchar_t*) inStr;
        @end
        
        //////////////////////////
        
        @implementation NSString ( WCarToString )
        
        - (NSString*) getStringFromWChar:(const wchar_t*) inStr
        {
        char* str = new char[wcslen( inStr )+1];    
        wcstombs(str, inStr, wcslen( inStr )+1 );   
        NSString* wNSString = [NSString stringWithCString:str encoding:NSUTF8StringEncoding];   
        delete [] str;
        return wNSString;
        }
        
        @end
        

        【讨论】:

        • 当你可以 [NSString initWithBytes] 时,这似乎有点过头了
        猜你喜欢
        • 2010-10-27
        • 2010-09-09
        • 2011-07-27
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多