Resurs fayli uchun ANSI bo'lmagan belgilarni o'z ichiga olgan literal mag'lubiyatni # belgilash mumkinmi?

Menda tuzilgan skript va #included fayl manba fayllari tomonidan ishlab chiqarilgan .h fayli bor, lekin (tm) belgisi tufayli tuzilmaydi:

#define PRODUCT_NAME Acme Widget™ 1.2.3

Qaytib olgan xato CommonAssemblyInfo.h (7): xato RC2018: noma'lum '0xe2' belgisi.

Shubhasiz men uni (TM) yordamida ishlashim mumkin, lekin "to'g'ri" belgini ishlatishni afzal ko'raman. Buni shunday qilish mumkinmi?


UPDATE

Muammoni batafsil bayon qilishim kerak edi va buning uchun uzr so'rayman. Menga muhim bir ma'lumotni qoldirganim kelib chiqadi: mavzu sarlavhasi fayl manba fayliga kiritilgan va shuning uchun xatolik manba kompilyatoridan keladi. Men haqiqatni aks ettirish uchun ushbu maqolaning sarlavhasini yangilamoqdaman.

1
Asos sifatida, siz U2F2 ni ko'rsatish uchun foydalanishingiz mumkin (U + 2122 yoki UTF-8da hex bayt E2 84 A2).
qo'shib qo'ydi muallif Jonathan Leffler, manba
Asos sifatida, siz U2F2 ni ko'rsatish uchun foydalanishingiz mumkin (U + 2122 yoki UTF-8da hex bayt E2 84 A2).
qo'shib qo'ydi muallif Jonathan Leffler, manba
Bir juft tirnoq belgisini ko'ring.
qo'shib qo'ydi muallif bmargulies, manba
@Olaf, tafsilotlarni o'chirib yuborganingiz uchun uzr. Va siz haqsiz, bu UTF-8 muammosini odatda belgilar majmuasi muammosi bilan etiketlasa shoshma-shosharlik. UTF-8 tagini olib tashlayman va savolni yaxshilashga harakat qilaman.
qo'shib qo'ydi muallif Hugh, manba
@Olaf, tafsilotlarni o'chirib yuborganingiz uchun uzr. Va siz haqsiz, bu UTF-8 muammosini odatda belgilar majmuasi muammosi bilan etiketlasa shoshma-shosharlik. UTF-8 tagini olib tashlayman va savolni yaxshilashga harakat qilaman.
qo'shib qo'ydi muallif Hugh, manba
Bir boshlang'ich uchun: nima uchun matn atrofida " ni qo'shmaysiz? Bu aniq bir mag'lubiyatga ega bo'lishi kerak, keyin siz kodlashni tekshirishingiz kerak." Minimal, Complete va Verifiable misol bilan hammasi kerakli ma'lumotlar bilan tanishib chiqing va nega UTF-8 tagini qo'shdingiz? UTF-8 nima? Qaysi kirish belgilar majmui derleyici foydalanadi?
qo'shib qo'ydi muallif Olaf, manba
Bir boshlang'ich uchun: nima uchun matn atrofida " ni qo'shmaysiz? Bu aniq bir mag'lubiyatga ega bo'lishi kerak, keyin siz kodlashni tekshirishingiz kerak." Minimal, Complete va Verifiable misol bilan hammasi kerakli ma'lumotlar bilan tanishib chiqing va nega UTF-8 tagini qo'shdingiz? UTF-8 nima? Qaysi kirish belgilar majmui derleyici foydalanadi?
qo'shib qo'ydi muallif Olaf, manba

8 javoblar

Macda (MacOS Sierra 10.12.3 da GCC 6.3.0 bilan ishlaydi), LANG = en_US.UTF-8 tomonidan o'rnatiladigan mahalliy terminalda quyidagi o'zgarishlarning barchasi kompilyatsiya qilinadi:

#include 

#define PRODUCT_STRING     "Acme Widget™ 1.2.3"
#define PRODUCT_UTF8       "Acme Widget\u2122 1.2.3"

#define PRODUCT_NAME        Acme Widget™ 1.2.3
#define STRINGIFY(x)        # x
#define CVT_TO_STRING(x)    STRINGIFY(x)

int main(void)
{
    puts(CVT_TO_STRING(PRODUCT_NAME));
    puts(PRODUCT_STRING);
    puts(PRODUCT_UTF8);
    return 0;
}

Jamlama:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \
>     -Wstrict-prototypes -Wold-style-definition tm17.c -o tm17
$

Chiqish, o'rganishdan hayratlanmaydi, shunday emasmi:

Acme Widget™ 1.2.3
Acme Widget™ 1.2.3
Acme Widget™ 1.2.3

Nazariy jihatdan, \ u2122 foydalanish uchun eng yaxshi (eng portativ) eslatmani.

Men ham # PRODUCT_NAME Acme Vidjet \ u2122 1.2.3 ni tanladim; bir xil ishlab chiqarilgan va ishlab chiqarilgan.

Unicode eskizlari C99ga qo'shildi; kerakli natijani olish uchun siz -std = c99 yoki -std = gnu99 ni belgilashingiz mumkin (yoki uning o'rniga C11 foydalaning).

1
qo'shib qo'ydi

Macda (MacOS Sierra 10.12.3 da GCC 6.3.0 bilan ishlaydi), LANG = en_US.UTF-8 tomonidan o'rnatiladigan mahalliy terminalda quyidagi o'zgarishlarning barchasi kompilyatsiya qilinadi:

#include 

#define PRODUCT_STRING     "Acme Widget™ 1.2.3"
#define PRODUCT_UTF8       "Acme Widget\u2122 1.2.3"

#define PRODUCT_NAME        Acme Widget™ 1.2.3
#define STRINGIFY(x)        # x
#define CVT_TO_STRING(x)    STRINGIFY(x)

int main(void)
{
    puts(CVT_TO_STRING(PRODUCT_NAME));
    puts(PRODUCT_STRING);
    puts(PRODUCT_UTF8);
    return 0;
}

Jamlama:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \
>     -Wstrict-prototypes -Wold-style-definition tm17.c -o tm17
$

Chiqish, o'rganishdan hayratlanmaydi, shunday emasmi:

Acme Widget™ 1.2.3
Acme Widget™ 1.2.3
Acme Widget™ 1.2.3

Nazariy jihatdan, \ u2122 foydalanish uchun eng yaxshi (eng portativ) eslatmani.

Men ham # PRODUCT_NAME Acme Vidjet \ u2122 1.2.3 ni tanladim; bir xil ishlab chiqarilgan va ishlab chiqarilgan.

Unicode eskizlari C99ga qo'shildi; kerakli natijani olish uchun siz -std = c99 yoki -std = gnu99 ni belgilashingiz mumkin (yoki uning o'rniga C11 foydalaning).

1
qo'shib qo'ydi

C11 ning UTF-8 kodli simvollari uchun sintaksisi mavjud. Sizning mag'lubiyatingiz uchun shunday ko'rinadi (manba, yoki uning hech bo'lmaganda bu qismi UTF-8da kodlangan deb taxmin qilinadi):

#define PRODUCT_NAME u8"Acme Widget™ 1.2.3"

C asosiy belgilaridan tashqari keng/Unicode mag'lubiyatidan tashqari matnlardagi manba fayllarda paydo bo'lishi mumkin bo'lgan belgilarni taqdim qilmaydi, ammo ba'zi ilovalar ularni kengaytma deb qabul qilishi mumkin.

Shu bilan bir qatorda kodlamaning baytlarini odatiy mag'lubiyatga, yoki xomashtaning so'lga almashtirish matniga kiritish kerak bo'ladi:

#define PRODUCT_NAME Acme Widget\xE2\x84\xA2 1.2.3

Biroq, satrlarni ajratuvchi qismlarni ajratish uchun juda ko'p foydalanilmaydi, chunki hex qochish sintaksisi faqat mag'lubiyat va tamsayı belgilarining matnlari mazmuniga egadir.

Aksariyat portativlar, @chux izohlarda taklif qilinganidek Unicode qochishidan foydalanishlari mumkin. Bunday holda, men butun strtf-8 satrining literali sifatida berilishi uchun hech qanday salbiy holatni ko'rmayapman:

#define PRODUCT_NAME u8"Acme Widget\u2122 1.2.3"
1
qo'shib qo'ydi
Ehtimol, dan foydalanishni oldini olish uchun "AcmeVidget" u8 "\ u2122" "1.2.3" bo'lishi mumkin.
qo'shib qo'ydi muallif chux, manba
Bu ish haqida kelishib oling. "Vidjet1 ..." (bo'sh joy) so'raganida, "Vidjet \ u21221" to'g'ri bo'lmasligi uchun ajratish kerak edi. Umumiy uslub sifatida ajratish orqali ushbu xatolikni oldini oladi.
qo'shib qo'ydi muallif chux, manba
Yaxshi taklif @ chux, lekin bu holda UTF-8 qismini ajratish va magistrallarni birlashtirib olish foydasi yo'q.
qo'shib qo'ydi muallif John Bollinger, manba

C11 ning UTF-8 kodli simvollari uchun sintaksisi mavjud. Sizning mag'lubiyatingiz uchun shunday ko'rinadi (manba, yoki uning hech bo'lmaganda bu qismi UTF-8da kodlangan deb taxmin qilinadi):

#define PRODUCT_NAME u8"Acme Widget™ 1.2.3"

C asosiy belgilaridan tashqari keng/Unicode mag'lubiyatidan tashqari matnlardagi manba fayllarda paydo bo'lishi mumkin bo'lgan belgilarni taqdim qilmaydi, ammo ba'zi ilovalar ularni kengaytma deb qabul qilishi mumkin.

Shu bilan bir qatorda kodlamaning baytlarini odatiy mag'lubiyatga, yoki xomashtaning so'lga almashtirish matniga kiritish kerak bo'ladi:

#define PRODUCT_NAME Acme Widget\xE2\x84\xA2 1.2.3

Biroq, satrlarni ajratuvchi qismlarni ajratish uchun juda ko'p foydalanilmaydi, chunki hex qochish sintaksisi faqat mag'lubiyat va tamsayı belgilarining matnlari mazmuniga egadir.

Aksariyat portativlar, @chux izohlarda taklif qilinganidek Unicode qochishidan foydalanishlari mumkin. Bunday holda, men butun strtf-8 satrining literali sifatida berilishi uchun hech qanday salbiy holatni ko'rmayapman:

#define PRODUCT_NAME u8"Acme Widget\u2122 1.2.3"
1
qo'shib qo'ydi
Ehtimol, dan foydalanishni oldini olish uchun "AcmeVidget" u8 "\ u2122" "1.2.3" bo'lishi mumkin.
qo'shib qo'ydi muallif chux, manba
Bu ish haqida kelishib oling. "Vidjet1 ..." (bo'sh joy) so'raganida, "Vidjet \ u21221" to'g'ri bo'lmasligi uchun ajratish kerak edi. Umumiy uslub sifatida ajratish orqali ushbu xatolikni oldini oladi.
qo'shib qo'ydi muallif chux, manba
Yaxshi taklif @ chux, lekin bu holda UTF-8 qismini ajratish va magistrallarni birlashtirib olish foydasi yo'q.
qo'shib qo'ydi muallif John Bollinger, manba

Visual C ++ Resurs Kompilyatori UTF-8ni tushunmaydi, lekin faqat ANSI va Unicode haqida biladi:

https://connect.microsoft.com/VisualStudio/feedback/details/214917/

RC kompilyatori UTF-16 ni qo'llab-quvvatlaydi. UTF-8 ga keladigan bo'lsak, hozirda RC Compiler tomonidan qo'llab-quvvatlanmaydi. Ushbu noqulaylik uchun osonlikcha vaqtinchalik hal qilish rc faylini UTF-16 ga Visual Studio Saqlash funktsiyasidan foydalangan holda aylantirishdir.

Xato 10 yil muqaddam 2006-10-24 yillarda "dizayni" bilan yopildi. Afsuski, UTF-8 .../s

Ehtimol, faylni Unicode sifatida saqlaganimda, hamma yaxshi edi.

0
qo'shib qo'ydi

Visual C ++ Resurs Kompilyatori UTF-8ni tushunmaydi, lekin faqat ANSI va Unicode haqida biladi:

https://connect.microsoft.com/VisualStudio/feedback/details/214917/

RC kompilyatori UTF-16 ni qo'llab-quvvatlaydi. UTF-8 ga keladigan bo'lsak, hozirda RC Compiler tomonidan qo'llab-quvvatlanmaydi. Ushbu noqulaylik uchun osonlikcha vaqtinchalik hal qilish rc faylini UTF-16 ga Visual Studio Saqlash funktsiyasidan foydalangan holda aylantirishdir.

Xato 10 yil muqaddam 2006-10-24 yillarda "dizayni" bilan yopildi. Afsuski, UTF-8 .../s

Ehtimol, faylni Unicode sifatida saqlaganimda, hamma yaxshi edi.

0
qo'shib qo'ydi

Sinash:

Replace ™ for unicode \u2122

Tavsiflardan foydalaning

#define PRODUCT_NAME "Acme Widget\u2122 1.2.3"
0
qo'shib qo'ydi

Sinash:

Replace ™ for unicode \u2122

Tavsiflardan foydalaning

#define PRODUCT_NAME "Acme Widget\u2122 1.2.3"
0
qo'shib qo'ydi