Tag: 编码

使用C在终端中打印多字节字符

我一直在试验一个自定义字符串对象(struct),如下所示: typedef struct { int encoding; int length; character * array; } EncodedString; 我的想法是,通过指定编码,我可以制作一些使用该编码的函数来正确打印字符串,即ASCII或utf-8或utf-16等。(请原谅我的字符编码无知。) 现在,我正打算打印出一个(普通话)汉字:狗(0x72d7)。 我想也许是通过逐个字符打印它,它会正常工作,但显然不是。 它打印只是“r?” (分别为0x72和0xd7)。 那么如何修改这个程序以便它打印出角色? #include typedef unsigned char character; typedef struct { int encoding; int length; character * array; } EncodedString; void printString(EncodedString str); int main(void) { character doginmandarin[] = {0x72U, 0xd7U}; EncodedString mystring = {0, sizeof doginmandarin, doginmandarin}; printString(mystring); […]

是否可以在C程序中“强制”使用UTF-8?

通常当我希望我的程序使用UTF-8编码时,我会写setlocale (LC_ALL, “”); 。 但是今天我发现它只是设置定位到环境的默认语言环境,我不知道环境是否默认使用UTF-8。 我想知道有没有办法强制字符编码为UTF-8? 另外,有没有办法检查我的程序是否使用UTF-8?

隐蔽压缩hex字符串(Base 64编码)

我有一个Base 64编码( http://www.adp-gmbh.ch/cpp/common/base64.html )字符串如下: KGVuYy12YWwgCiAoZWNkaCAKICAocyAjMDQwMTE3RkFBRDEwQzAwRDAxMENDOTA4NkUwRjVCMEMyN0YzQkM3REY4NENDNjMxQjM5MEFEODJEOERGOUZFNjYxOTU0NkY0NzgyREY1QkRBMjFEOTY3NTkxQzc1QTVDOTc1RUJFRDMyNUI4ODBCNzk0NDdFMTY2NUQ5Q0M0M0MxQSMpCiAgKGUgIzA0MzExNjUyNzE0QkFDRkQzOERFM0NFQTM4NDA4Q0ZBQkVFQTNGRjZGNjIwQkQyQzBBNzU1MTY0MjlBQzJERTRCOTI4OTFDOEZBQ0RDNDEyMjNGMTlGQjc2NjgzQzI4RDc5NkY5Njc4QTU4QzRDMzVDMkJDRUEyMEJEQzYzRURCQTkjKQogICkKICkKAA == 以下Bluez函数用于压缩此Base 64编码字符串以将其发送到BLE设备: size_t data_from_string(const char *str, uint8_t **data) { char tmp[3]; size_t size, i; info(“data_from_string”); size = strlen(str) / 2; *data = (uint8_t *)malloc(size); if (*data == NULL) return 0; tmp[2] = ‘\0’; for (i = 0; i < size; i++) { memcpy(tmp, str + (i * 2), 2); […]

为什么在winapi中转换UTF16 – > UTF8 – > UTF16后,filename有不同的字节?

我有下一个文件: 我使用ReadDirectoryChangesW来读取当前文件夹中的更改。 我得到了这个文件的路径:L“TESTӠ⬨☐.ipt”: 接下来,我想将其转换为utf8并返回: std::string wstringToUtf8(const std::wstring& source) { const int size = WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0, NULL, NULL); std::vector buffer8(size); WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer8.data(), size, NULL, NULL); } std::wstring utf8ToWstring(const std::string& source) { const int size = MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0); std::vector buffer16(size); MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer16.data(), size); […]

C中的摩尔斯电码转换器

是它的作业我们假设有char二维数组保持字符,大小限制为255 char char string[100][255]; 程序neede:用户将输入的莫尔斯代码更改为字母/英文字母(大写字母) 样本输入 2 …. . .-.. .-.. — / .– — .-. .-.. -.. .— — -.- . 示例OutPut 情况1: HELLO WORLD 案例2: JOKE 我唯一的想法是让一个单词的第一个字符由用户输入..要检查它是否是’。’ 或’ – ‘然后仔细并手动分配..嵌套的if(string[i][c]==’.’)和每个嵌套的最后一个if将是if(string[i][c]==’ ‘)然后打印出字母“E”的例子 if(string[i][c]==’.’) { isspace(string[i][c+1]) printf(“E”); } 现在我的问题是..有没有更简单的方法来解决这个问题? 我不需要键入相同的’ – ‘和’。’ 如果声明..和东西? 并让我的思绪爆炸? 因为我用if或case语句丢失了对应下一个char的跟踪?

16位wchar_t是否正式表示完整的Unicode?

在¹comp.lang.c++ Usenet组中,我最近断言,基于我认为我所知道的,Windows的16位wchar_t ,使用UTF-16编码,有时需要两个这样的值(称为“代理对”)单个Unicode代码点,对于表示Unicode无效。 这肯定是不方便的,并且与C和C ++标准库(例如字符分类)的假设相冲突,每个代码点都表示为单个值,尽管Unicode联盟的2004年“技术说明12”为使用UTF-16提供了一个很好的例子。用于内部处理,具有令人印象深刻的软件列表。 当然,似乎最初的意图是每个代码点有一个wchar_t值,这与C和C ++标准库的假设一致。 例如,在www.unix.org网页上的“ISO C修订1(MSE)”中,关于1995年将wchar_t纳入C标准的修订,作者坚持认为 “一个字节/一个字符模型的主要优点是,以固定宽度的块处理数据非常容易。 出于这个原因,发明了广泛性的概念。 宽字符是一种抽象数据类型,其大小足以包含特定平台上支持的最大字符。 但事实certificate,C和C ++标准似乎没有谈论支持的最大字符,而只讨论支持的语言环境中最大的扩展字符集 : wchar_t必须足够大才能代表最大扩展字符集中的每个代码点字符集 – 但不是Unicode,当没有Unicode语言环境时。 C99§7.17/ 2(来自N869草案): “ [ wchar_t type]是一个整数类型,其值范围可以表示支持的语言环境中指定的最大扩展字符集的所有成员的不同代码。 这几乎与C ++标准中的措辞完全相同。 并且它似乎意味着使用受限制的一组受支持的语言环境, wchar_t确实可以很小,直到使用UTF-8编码的单个字节(例如,在ASCII的A到Z之外没有标准库字符分类function的噩梦可能性,但是嘿)。 可能以下要求比这更广泛: C99§7.1.1/ 4: “ 宽字符是wchar_t类型的对象的代码值(二进制编码整数),对应于扩展字符集的成员。 …因为它引用了扩展字符集,但该术语似乎无法在任何地方进一步定义。 至少在Microsoft的C和C ++运行时,没有Unicode语言环境:该实现setlocale仅限于每个字符最多2个字节的字符编码: MSDN的setlocale文档: “可用的区域设置名称,语言,国家/地区代码和代码页的集合包括Windows NLS API支持的所有内容,除了每个字符需要两个以上字节的代码页,例如UTF-7和UTF-8。 如果您提供的代码页值为UTF-7或UTF-8,则setlocale将失败,返回NULL 。 所以它似乎与我认为的相反,与我的断言相反,Windows的16位wchar_t正式可以。 主要是由于Microsoft巧妙地缺乏对UTF-8语言环境的支持,或者每个字符超过2个字节的任何语言环境。 但它真的如此,是16位wchar_t好吗? 链接: ¹新闻:comp.lang.c ++ ²http: //unicode.org/notes/tn12/#Software_16 ³http ://www.unix.org/version2/whatsnew/login_mse.html ⁴https : //msdn.microsoft.com/en-us/library/x99tb11d.aspx

如何有效编码/解码压缩位置描述?

我正在为日本象棋变体写一个桌面。 为了索引表基,我将每个国际象棋位置编码为整数。 在其中一个编码步骤中,我编码棋盘上的棋子。 由于实际方法有点复杂,让我以简化的方式解释问题。 编码 在最后的桌面游戏中,我有(比方说)六个不同的棋子,我想在9个方格的棋盘上分发。 我可以通过六元组( a , b , c , d , e , f )天真地表示他们的位置,其中每个变量a到f是0到8范围内的数字,表示相应的棋子所在的位置。 然而,这种表示并不是最佳的:没有两个国际象棋棋子可以占据同一个方格,但前面提到的编码很乐意允许这样做。 我们可以通过六元组[ a,b’,c’,d’,e’,f’ ]对相同位置进行编码,其中a与之前的a相同, b’是0到7之间的数字,表示第二件正方形的数量。 这通过为第一块未打开的每个方格分配从0到7的数字来工作。 例如,如果第一块位于正方形3上,则第二块的正方形数字为: 1st piece: 0 1 2 3 4 5 6 7 8 2nd piece: 0 1 2 – 3 4 5 6 7 其他部分类似地编码, c’作为0到6之间的数字, d’作为0到5之间的数字等。例如,幼稚编码(5,2,3,0,7,4)产生紧凑编码(5,2,2,0,3,1): 1st: 0 1 2 […]

字符常量的C编码

我的程序员的本能会说c中的字符常量(例如:’x’)是使用编译它的机器上的机器字符集编码的。 但是,以下内容来自“C编程语言:ANSI C版” “字符常量是用单引号括起来的一个或多个字符的序列,如’x’。只有一个字符的字符常量的值是执行时机器字符集中字符集的数值。” 强调最后3个字。 任何人都可以解释为什么他们会说“在执行时”。 当然,字符值是在编译的二进制文件(或ELF,A.OUT ……)中编码的? 我在想,但无法为此提出任何合理的解释,肯定K&R知道他们在做什么!

Windows:如何构建X264.lib而不是.dll

我下载了X264源码并安装了mingw。 步骤1: 在MINGW bash中执行此操作: ./configure –disable-cli –enable-shared –enable-win32thread – -extra-ldflags = -Wl, – output-def = libx264.def 然后’制作’ 第2步: 将libx264-142.dll重命名为libx264.dll并打开VS2012命令提示符并执行以下操作: LIB /DEF:libx264.def 它给了我libx264.lib和对象libx264.exp 第3步: 包含使用X264 API的VS2012项目中的lib文件。 问题: 当我启动项目时,我收到以下错误消息: “程序无法启动,因为您的计算机缺少libx264.dll” 题: 当我链接静态库时,为什么要查找dll? 我该如何解决这个问题? 我想构建一个静态X264库,我可以将其链接到我的项目中。 编辑: 我只需将dll放在与项目可执行文件相同的目录中。 但是 – 我的问题仍然存在:如何构建静态 x264库? 所以我不需要dll?

C库用于压缩顺序正整数

我有一个非常普遍的问题,就是为磁盘内的字符串数组创建一个索引。 简而言之,我需要将每个字符串的位置存储在磁盘表示中。 例如,一个非常天真的解决方案是索引数组,如下所示: uint64 idx [] = {0,20,500,1024,…,103434}; 其中第一个字符串位于第0位,第二个字符串位于第20位,第三个位于第500位,第n个位于第103434位。 这些位置总是按顺序排列为非负64位整数。 虽然数字可能会有任何差异,但实际上我认为典型的差异在2 ^ 8到2 ^ 20的范围内。 我希望这个索引在内存中是mmap,并且将随机访问这些位置(假设均匀分布)。 我正在考虑编写自己的代码来进行某种块增量编码或其他更复杂的编码,但是在编码/解码速度和空间之间有很多不同的权衡,我宁愿把工作库作为一个起点。甚至可能在没有任何自定义的情况下解决问题。 任何提示? 一个c库是理想的,但是c ++也可以让我运行一些初步的基准测试。 如果您还在关注,还有一些细节。 这将用于在库cmph( http://cmph.sf.net )上构建类似于cdb( http://cr.yp.to/cdb/cdbmake.html )的库。 简而言之,它适用于基于大型磁盘的只读关联映射,内存中的索引很小。 由于它是一个库,我无法控制输入,但我想要优化的典型用例有数百万个值,平均值大小在几千字节范围内,最大值在2 ^ 31。 为了记录,如果我没有找到准备使用的库,我打算在64个整数的块中实现delta编码,其中初始字节指定到目前为止的块偏移量。 块本身将用树索引,给我O(log(n / 64))访问时间。 有太多其他选择,我宁愿不讨论它们。 我真的很期待使用代码而不是如何实现编码的想法。 我将很高兴与大家分享我工作后所做的一切。 感谢您的帮助,如果您有任何疑问,请告诉我。