Board logo

标题: [已解决]有无GB2312转UTF-8的命令行工具? [打印本页]

作者: tireless     时间: 2008-9-5 23:18    标题: [已解决]有无GB2312转UTF-8的命令行工具?
找了下,找到这个 命令行GB2312,UTF-8,Unicode,BIG5编码转换工具VBS版(2007-12更新) 但我不是转换文件。我是想转换剪贴板中的GB2312到UTF-8,然后进行Google中译英... 英译中可以直接用网址: "http://translate.google.com/translate_t?hl=en&ie=UTF8&text=%S&langpair=en%7Czh-CN" 可是中译英......该怎么办? [ Last edited by tireless on 2008-9-6 at 11:58 PM ]

作者: knoppix7     时间: 2008-9-6 13:15
CONCMD

作者: tireless     时间: 2008-9-6 14:43
谢谢。可是怎么测试不成功呢? 我的记事本保存的好像是 GBK,而 Google 的中译英不是将中文变为 UTF-8 吗? 转换后字符没有变: ConCmd.exe /o:utf8 3.txt 31.txt 3.txt 的内容是“字符串”。转换后的 31.txt 的内容还是“字符串”。。

作者: slore     时间: 2008-9-6 22:47
。。。UTF8是编码格式,记事本支持这个编码就直接给你翻译成你能看的懂的字符串。。。IE里面的utf8貌似是将汉字转换成16进制那种吧。

作者: obsolete     时间: 2008-9-6 23:05
我理解错了,抱歉。。。 ie高级选项有个设置“总是以utf-8发送url”,这里汉字变成%ef%ad这种形式有两个过程,第一是utf-8编码,第二是字节码换作16进制。 记事本中ANSI编码是一种本地编码,它是根据本地的默认编码,在中文操作系统下,它是GBK编码。 [ Last edited by obsolete on 2008-9-6 at 11:15 PM ]

作者: obsolete     时间: 2008-9-6 23:06
百度搜索 "url 编码"

作者: obsolete     时间: 2008-9-6 23:30
我找不到concmd这个工具,如果楼主确实得到了一个UTF-8编码的txt文件,可以打开,另存,看一下默认选中的是不是UTF-8编码,如果是那就对了。 还需要ultraedit,打开这个UTF-8编码的文件,ctrl+H,去除前三个字节,其它字节前面加上%,就是URL编码的结果了。 文件头的前三个字节就是传说中的BOM,大概是byte-order-mark。

作者: obsolete     时间: 2008-9-6 23:51
功力不够。。。java里两句就搞定,c不知道怎么弄。 楼主的问题应该可以换个角度解决? http://translate.google.com/translate_t?hl=en&ie=GBK&text=被自杀&langpair=zh-CN%7Cen# 或 http://translate.google.com/translate_t?ie=GBK&text=被自杀&sl=zh_CN&tl=en# [ Last edited by obsolete on 2008-9-6 at 11:58 PM ]

作者: HAT     时间: 2008-9-7 00:16    标题: Re 8楼
学习了

作者: obsolete     时间: 2008-9-7 01:56
谢谢HAT~~ 试着用c++写了一个,接受一个字符串参数,如有问题麻烦大家修正
#include "stdafx.h"
#include "iostream.h"
#include "windows.h"
#include "winnls.h"
#include "string"

using namespace std;

#pragma comment(lib, "kernel32.lib")

int main(int argc, char* argv[])
{
	if (argc != 2)
	{
		return 1;
	}

	char * text = argv[1];
	int cchWideChar = MultiByteToWideChar(CP_ACP,0,text,strlen(text),NULL,0) + 1;
	wchar_t * lpcwStr = new wchar_t[cchWideChar];
	ZeroMemory(lpcwStr, sizeof(wchar_t) * cchWideChar);
	MultiByteToWideChar(CP_ACP,0,text,strlen(text),lpcwStr,cchWideChar);

	cchWideChar = WideCharToMultiByte(CP_UTF8,NULL,lpcwStr,-1,NULL,0,NULL,FALSE);
	char * lpMultiByteStr = new char[cchWideChar];
	WideCharToMultiByte(CP_UTF8,NULL,lpcwStr,-1,lpMultiByteStr,cchWideChar,NULL,FALSE);
	for (int i = 0; i < strlen(lpMultiByteStr); i++)
	{
		int byte = lpMultiByteStr[i];
		byte = byte >=0 ? byte : 256 + byte;
		cout << '%' << hex << byte;
	}
	cout << endl;
	delete lpcwStr;
	delete lpMultiByteStr;
	return 0;
}
[ Last edited by obsolete on 2008-9-7 at 02:09 AM ]
附件 1: urlenc.rar (2008-9-7 02:10, 16.54 KiB,下载次数: 21)

作者: obsolete     时间: 2008-9-7 11:36
这个保留一些常见字符,不转成16进制形式
#include "stdafx.h"
#include "iostream.h"
#include "atlbase.h"

int main(int argc, char* argv[])
{
	if (argc != 2)
	{
		return 1;
	}

	USES_CONVERSION;
	wchar_t * lpcwStr = A2W(argv[1]);

	int cchWideChar = WideCharToMultiByte(CP_UTF8,NULL,lpcwStr,-1,NULL,0,NULL,FALSE);
	char * lpMultiByteStr = new char[cchWideChar];
	WideCharToMultiByte(CP_UTF8,NULL,lpcwStr,-1,lpMultiByteStr,cchWideChar,NULL,FALSE);

	for (unsigned int i = 0; i < strlen(lpMultiByteStr); i++)
	{
		char c = lpMultiByteStr[i];
		if (c >= 'a' && c <= 'z'
			|| c >='A' && c <= 'Z'
			|| c >= '0' && c <= '9'
			|| c == '/'
			|| c == ':'
			|| c == '-'
			|| c == '_'
			|| c == '.'
			|| c == '*'
			|| c == '?'
			|| c == '&'
			|| c == '=')
		{
			cout << c;
		} else if (c == ' ')
		{
			cout << '+';
		} else
		{
			cout << '%' << hex << (int) (unsigned char) c;
		}
	}
	cout << endl;

	delete lpMultiByteStr;
	return 0;
}
[ Last edited by obsolete on 2008-9-7 at 11:54 AM ]
附件 1: urlenc2.rar (2008-9-7 11:41, 16.63 KiB,下载次数: 15)

作者: tireless     时间: 2008-9-7 19:50
太谢谢obsolete了。 这下 hoekey 就能实现用快捷键来划词翻译了。 Update: 中译英也可这样:
http://translate.google.com/translate_t?#zh-CN%7cen%7c测试文字
[ Last edited by tireless on 2009-2-7 at 16:58 ]

作者: greenworld     时间: 2010-11-9 07:51
obsolete老大,太感谢了,这个强烈支持