Я просто начинаю на некотором программировании обрабатывать имена файлов с неанглийскими именами в системе 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*), и имеющий проблемы.
Кто-либо может пролить некоторый свет на это?
Лучшим 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
.
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*.