none
Metro风格C++应用开发,如何将一个GBK编码的String,转换为UTF8编码的String? RRS feed

  • 问题

  •  从网络上获取了一个GBK编码的字符串,String^ GBKStr = //GBK编码字符串

    如何将它转换为UTF8的字符串?

    String^ UTF8Str = ConvertGBK2UTF8(GBKStr );

    网上找了一个不起作用

    char* GBKToUtf8(const char* strGBK)
    {
     int len=MultiByteToWideChar(CP_ACP, 0, (LPCCH)strGBK, -1, NULL,0);
     unsigned short * wszUtf8 = new unsigned short[len+1];
     memset(wszUtf8, 0, len * 2 + 2);
     MultiByteToWideChar(CP_ACP, 0, (LPCCH)strGBK, -1, (LPWSTR)wszUtf8, len);
     len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
     char *szUtf8=new char[len + 1];
     memset(szUtf8, 0, len + 1);
     WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, (LPSTR)szUtf8, len, NULL,NULL);

     return szUtf8;
    }

    2012年6月27日 12:29

答案

全部回复

  • 这个函数本身没有问题,问题在于你将Platform的String 是不能直接当作 char* 来使用的。

    请参考这个帖子:http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/5eac7cb2-3fe9-4cba-a653-329d140edeb6/

     不过,既然你接受的是GBK编码的字符串,那么你应该用char* 去接住,而不是String^, String^是宽字符的字符串,他可以转成 wchar_t ,但不能成char。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 5:41
    版主
  • 补充一下,默认String^接受Unicode编码。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 7:05
    版主
  • hi,baobao

        多谢回复,从你的回复来看,String之后和转换没有问题,问题应该出现在接收时,直接转到String了,而String接收的是Unicode

    字符串是通过下面的这个示例

    PushNotificationsHelper

    中的

    channelAndResponse->WebResponse

    返回的,方便的话,能否帮忙看看,是否是这里面出了问题?需要如何修改?


    • 已编辑 QitaoFan 2012年6月28日 11:05
    2012年6月28日 11:03
  • 代码

     if (this->Notifier == nullptr)
     {
      this->Notifier = ref new PushNotificationsHelper::Notifier();
     }

     Platform::String^ ServerURL = GameConfig::Current->BuildAndGetServerHttpUrl();

     create_task(this->Notifier->OpenChannelAndUploadAsync(ServerURL/*ServerText->Text*/)).then([this] (ChannelAndWebResponse^ channelAndResponse)
     {
      //this->NotifyUser("Channel uploaded! Response:" + channelAndResponse->WebResponse, NotifyType::StatusMessage);
      if(channelAndResponse->WebResponse != nullptr)
      {
       TRACE(L"Channel uploaded! Response:\r\n %ls" , channelAndResponse->WebResponse->Data());
       this->Channel = channelAndResponse->Channel;
     });

    2012年6月29日 2:07
  • 或者简单点描述吧

    从HTTP URI获取一个带GBK编码字段内容的XML,如何处理?或者还是要想办法如何以原始char的形式收下来,如何收呢?

    auto uri = ref new Uri("http:\\......");

       create_task(XmlDocument::LoadFromUriAsync(uri)).then([this, file](XmlDocument^ xmldoc)
       {
        if(xmldoc != nullptr)
        {

        }

       });

    2012年6月30日 16:40
  • 你先不要以XML形式去Load, 而是按照流形式读入成字节数组,然后进行转换后成Unicode 在利用String^封装,XmlDocument读入。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月2日 10:50
    版主
  • 我看了几个sample都是String的,

    那怎么从HTTP URI获取字节数组,如何收呢?

    是要想办法怎么,直接使用IXMLHTTPRequest2这个类吗,还是其他方法?

    2012年7月6日 10:09
  • 暂时先关闭把
    • 已标记为答案 QitaoFan 2012年7月11日 11:55
    2012年7月11日 11:55