Какое кодирование имена файлов в NTFS, сохраненном как?

Я просто начинаю на некотором программировании обрабатывать имена файлов с неанглийскими именами в системе WinXP. Я сделал некоторое рекомендуемое чтение на unicode, и я думаю, что получаю общее представление, но некоторые части все еще не очень ясны мне.

А именно, что кодирование (UTF-8, UTF-16LE/BE) является именами файлов (не содержание, но подлинное имя файла) сохраненный в NTFS? Действительно ли возможно открыть какой-либо файл с помощью fopen (), который берет символ*, или у меня нет выбора, кроме как использовать wfopen (), который использует wchar_t* и по-видимому берет строку UTF-16?

Я пытался вручную подать UTF-8 закодированная строка к fopen (), например.

unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // 가.txt

FILE* f = fopen((char*)filename, "wb+");

но это вышло как 'ê°€.txt'.

У меня создалось впечатление (который может быть неправильным), который UTF8-закодированная строка удовлетворила бы в открытии любого имени файла в соответствии с Windows, потому что я, кажется, неопределенно помню некоторое раздающее Приложение Windows (символ*), не (wchar_t*), и имеющий проблемы.

Кто-либо может пролить некоторый свет на это?

41
задан radoh 3 April 2017 в 15:07
поделиться

2 ответа

Лучшим PCRE для извлечения ADDR_SPEC является:

 /[a-z0-9\._%+!$&*=^|~#%'`?{}/\-]+@([a-z0-9\-]+\.){1,}([a-z]{2,6})/

Но если вы действительно хотите извлечь RFC 2822, то вам нужно что-то вроде:

 /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/

C.

-121--4691002-

Для устранения второй проблемы используйте

annotate("text", 0.375, -1.25,
         label=paste("rho==", round(cor(abm.data$area, abm.data$U1_2), 2)),
         parse=TRUE)

, т. е. «rho =» .

Изменить: Вот решение первой проблемы

library("plyr")
library("ggplot2")

set.seed(1)
df <- data.frame(x=rnorm(300), y=rnorm(300), cl=gl(3,100))   # create test data
df.cor <- ddply(df, .(cl), function(val) sprintf("rho==%.2f", cor(val$x, val$y)))

p1 <- ggplot(data=df, aes(x=x)) +
             geom_point(aes(y=y, colour="col1", alpha=0.4)) +
             facet_wrap(~ cl, ncol=3) +
             geom_text(data=df.cor, aes(x=0, y=3, label=V1), parse=TRUE) +
             scale_colour_manual(values=c("col1"="red")) +
             opts(legend.position="none")
print(p1)
-121--1683700-

NTFS хранит имена файлов в UTF-16, однако fopen использует ANSI (не UTF-8).

Для использования UTF16-encoded имени файла необходимо использовать Юникод-версии открытых вызовов файла. Для этого определите в проекте UNICODE и _ UNICODE . Затем используйте вызов CreateFile или wfopen .

37
ответ дан 27 November 2019 в 00:49
поделиться

fopen() - в MSVC on windows не принимает (по умолчанию) utf-8 закодированный char*.

К сожалению, utf-8 была придумана сравнительно недавно в великой схеме вещей. Windows API разделены на версии Unicode и Ansi. каждое windows api, которое принимает или обрабатывает строки, на самом деле доступно с суффиксом W или A - W для символа "Wide" / "Wnicode" и A для Ansi. Макро-магия скрывает всё это от разработчика, так что вы просто вызываете CreateFile с символом char* или wchar_t* в зависимости от вашей конфигурации сборки, не зная разницы.

Кодировка 'Ansi' на самом деле не является специфической кодировкой:- Но означает, что кодировка, используемая для "char" строк, специфична для настройки локали на ПК.

Теперь, потому что функции c-runtime - такие как fopen - должны работать по умолчанию без ведома разработчика - на windows системах они ожидают, что получат свои строки в локальной кодировке windows. msdn указывает на то, что сэтлокаль c-runtime api может изменить локаль текущего потока - но специально говорит, что он не будет работать для любых локалей, которым требуется более 2 байт на символ - например, utf-8.

Итак, в Windows нет ярлыка. Вам нужно , чтобы использовать wfopen, или родной API CreateFileW (или создать свой проект с помощью настроек Unicode build и просто вызвать Createfile) со строками wchar_t*.

14
ответ дан 27 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: