| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 332 人关注过本帖
标题:不同編碼字符串的轉換測試
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:3 
不同編碼字符串的轉換測試
程序代码:
#include "stdafx.h"
#include <cstdio>

using namespace System;
using namespace System::Text;

int main(array<String^>^ args)
{
    Console::WriteLine(L"用C的printf()函數輸出不同編碼的字符串測試");
    Console::WriteLine();

    String^ unicodeString = "bccn論壇歡迎您!";
    Encoding^ unicode = Encoding::Unicode;
    array<Byte>^ unicodeBytes = unicode->GetBytes(unicodeString);
    Console::WriteLine(L"{0}[{1}]:", unicode->BodyName, unicode->CodePage);
    //Console::WriteLine(L"{0}", unicode->GetString(unicodeBytes));
    printf_s("%s\n", unicodeBytes);
    for each (Byte b in unicodeBytes)
    {
        Console::Write(L"{0} ", b);
    }
    Console::WriteLine();
    Console::WriteLine();

    Encoding^ ansi = Encoding::Default;
    array<Byte>^ cString = Encoding::Convert(unicode, ansi, unicodeBytes);
    Console::WriteLine(L"{0}[{1}]:", ansi->BodyName, ansi->CodePage);
    printf_s("%s\n", cString);
    for each (Byte b in cString)
    {
        Console::Write(L"{0} ", b);
    }
    Console::WriteLine();
    Console::WriteLine();

    Encoding^ utf8 = Encoding::UTF8;
    array<Byte>^ utf8Bytes = Encoding::Convert(unicode, utf8, unicodeBytes);
    Console::WriteLine(L"{0}[{1}]:", utf8->BodyName, utf8->CodePage);
    //Console::WriteLine(L"{0}", utf8->GetString(utf8Bytes));
    printf_s("%s\n", utf8Bytes);
    for each (Byte b in utf8Bytes)
    {
        Console::Write(L"{0} ", b);
    }
    Console::WriteLine();
    Console::WriteLine();
    
    return 0;
}


图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 降温 字符串 
2015-11-07 19:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
.net中的String,是Unicode字符,每一個字符是Char類型,這種Char是Unicode編碼的,測試顯示,那是Utf-16編碼,每個字符2字節,不論是否ASCII字符,都是2字節編碼。

使用C/C++的printf()函數無法正確顯示這種編碼的字符串,轉換爲系統Default編碼的結果,表示那是GB2312編碼,這是printf()函數可以正確輸出的C字符串。從Unicode編碼到GB2312編碼,需要做轉換工作,做法如代碼所示。

utf-8編碼雖然也是Unicode編碼,但是另一種編碼方式,printf()函數同樣無法正確顯示。

要把不同編碼的字節序列編碼爲正確的字符串顯示出來,首先需要確定它是什麽編碼,然後利用該編碼系統中的GetString()方法,把它編譯爲String字符串即可,1樓被注釋掉的兩行就是用於這個測試。

注意:不同編碼之間的轉換,是沒有確定算法的(或者說我不知道)。從運行結果也可以看得出來,尤其是Utf-16和GB2312之間,雖然是同一個中文字符,編碼也未必一樣。

[此贴子已经被作者于2015-11-7 19:46编辑过]


授人以渔,不授人以鱼。
2015-11-07 19:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這是.net框架中的API,非.net的肯定也有,但目前還沒摸索出來。不過,.net的類庫非常好用。

授人以渔,不授人以鱼。
2015-11-07 19:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
本地C/C++程序,即用main()作入口函數的那種,默認是ANSI編碼,亦即GB2312。若用wmain()作函數入口,則是Unicode編碼,是Utf-16。

char類型對應ANSI編碼,wchar_t類型對應Unicode編碼。

授人以渔,不授人以鱼。
2015-11-07 19:49
快速回复:不同編碼字符串的轉換測試
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016922 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved