字符数组到十六进制等效的日语字符

Char array to hex equivalent for Japanese characters

任何人都知道如何在 C 编程中获取日文字符数组的十六进制, 任何库或函数都可以。

假设我的字符串是 "アイコン"

它的十六进制等价物是 EFBDB1EFBDB2EFBDBAEFBE9D。 提前致谢。

根据您在问题中提供的信息判断,您的字符串似乎以 UTF-8.

编码

以十六进制表示打印空终止字符数组的内容很简单:

void print_string_as_hex( const char *str )
{
    while ( *str != '[=10=]' )
    {
        printf( "%02X", (unsigned char)*str );
        str++;
    }
}

由于 UTF-8 格式的设计方式是永远不会对任何值为 0 的字节进行编码,因此您无需了解 UTF-8 编码的细节.您可以简单地假设,当遇到值为 0 的字节时,它一定是字符串的终止空字符。因此,您可以将数组视为包含固定长度的单字节字符编码。

虽然你在问题中没有提到这一点,但在评论部分,你提到你不想打印结果,而是想将十六进制表示写入字符串,这样你可以将它传递给另一个函数。这也很简单:

void write_string_as_hex( const char *str, char *hex )
{
    while ( *str != '[=11=]' )
    {
        sprintf( hex, "%02X", (unsigned char)*str );
        str += 1;
        hex += 2;
    }
}

但是,该函数有些危险,因为您必须确保缓冲区 hex 足够大以包含输出,否则会出现 buffer overflow

因此,该函数的安全版本如下所示:

#include <stdio.h>
#include <stdbool.h>

//this function will return true on success, false on failure
bool write_string_as_hex( const char *str, char *hex, size_t hex_size )
{
    size_t remaining = hex_size;

    while ( *str != '[=12=]' )
    {
        //check if buffer size exceeded
        if ( remaining < 3 )
            return false;

        //convert and verify that exactly 2 characters were written
        if ( snprintf( hex, 3, "%02X", (unsigned char)*str ) != 2 )
            return false;

        //advance both pointers
        str += 1;
        hex += 2;

        //update remaining buffer size
        remaining -= 2;
    }

    return true;
}