如何将unicode字符串文字与字节连接?

时间:2016-02-25 19:39:58

标签: c string unicode byte concatenation

考虑这个USB字符串描述符:

#define USB_PRODUCT_STRING_DESCRIPTOR_LENGTH (34U)
#define USB_DESCRIPTOR_TYPE_STRING (0x03U)

uint8_t UsbProductString[USB_PRODUCT_STRING_DESCRIPTOR_LENGTH] = {
    USB_PRODUCT_STRING_DESCRIPTOR_LENGTH,
    USB_DESCRIPTOR_TYPE_STRING,
    'C', 0x00U,
    'O', 0x00U,
    'M', 0x00U,
    'P', 0x00U,
    'O', 0x00U,
    'S', 0x00U,
    'I', 0x00U,
    'T', 0x00U,
    'E', 0x00U,
    ' ', 0x00U,
    'D', 0x00U,
    'E', 0x00U,
    'V', 0x00U,
    'I', 0x00U,
    'C', 0x00U,
    'E', 0x00U,
};

有没有办法以更容易阅读的方式表现它?可能使用u""字符串语法?

1 个答案:

答案 0 :(得分:0)

  

如何将unicode字符串文字与字节连接?

我认为没有办法解决标题问题。

  

有没有办法以更容易阅读的方式表现它?可能使用你的""字符串语法?

没有简单的方法来清楚地处理连接3个字段。

回想一下,u"some text"char16_t一起使用,可能/可能不代表UTF-16编码。

也许简单使用3字段类型?

#include <stddef.h>
#include <uchar.h>
#include <stdio.h>

//#define USB_PRODUCT_STRING_DESCRIPTOR_LENGTH (34U)
#define USB_DESCRIPTOR_TYPE_STRING 1
#define UPS_SIZE(S) (sizeof(uint8_t) + sizeof(uint8_t) + sizeof(S) - 2 /*null character*/)

typedef struct {
  uint8_t length;
  uint8_t descriptor_type;
  char16_t descriptor[127];  // 127 Maximum length
} USBProductString_T;

int main(void) {
  #if __STDC_UTF_16__ == 1
    puts("values of type char16_t are UTF-16 encoded.");
  #else
    puts("values of type char16_t are not known to be UTF-16 encoded.");
    return 0;
  #endif


  #define COMPOSITE_DEVICE u"COMPOSITE DEVICE"
  USBProductString_T UsbProductString = 
    { UPS_SIZE(COMPOSITE_DEVICE), USB_DESCRIPTOR_TYPE_STRING, COMPOSITE_DEVICE };


  printf("%u %u %zu\n", 1U*UsbProductString.length, 1U*UsbProductString.descriptor_type, 
      sizeof UsbProductString);
  return 0;
}

输出

values of type char16_t are UTF-16 encoded.
34 1 256

进一步解决OP附加限制 - 空格:

从常量类型中解耦常量。使用char16_t[]形成UsbProductString,然后进行特殊的后初始化/复制/比较/创建功能以使用它。各种方法取决于未陈述的设计约束。

static char16_t UsbProductString[] = u"COMPOSITE DEVICE";

void FormString(uint8_t buf[], const char16_t *s) {
  unsigned bi = 0,si = 0;
  buf[++bi] = USB_DESCRIPTOR_TYPE_STRING
  while (s[si]) {
    buf[++bi] = s[si] % 256;
    buf[++bi] = s[si] / 256;
    si++;
  }
  buf[0] == ++bi;
}

uint8_t buf[sizeof UsbProductString - 2  + 2];  // string has an unneeded null character
FormString(buf, UsbProductString);
Send(buf);

你的帖子想要一个具有1)灵活数组成员的结构,2)用初始化值声明它。据我了解C,这是不可能的。你是正确的考虑UsbProductString[]一个数组,并尝试将第一个字段楔入一个字符串的一部分,但这会牺牲可读性 - 试图创建&#34; UTF-16&#34; uint8_t数据。