Имя файла является строкой байтов; независимо от языкового стандарта или любых других используемых вами соглашений о том, как должны быть закодированы имена файлов, строка, которую вы должны передать fopen
и всем функциям, принимающим имена файлов/пути, является точной строкой байтов для имени файла. Например, если у вас есть файл с именем ö.txt
в кодировке UTF-8 в NFC, а ваша локаль имеет кодировку UTF-8 и использует NFC, вы можете просто написать имя как ö.txt
и передать его fopen
. Однако, если ваша локаль основана на латинице-1, вы не можете передать латинскую-1 форму ö.txt
("\xf6.txt"
) в fopen
и ожидать, что она будет успешной; это другая строка байтов и, следовательно, другое имя файла. Вам нужно будет передать "\xc3\xb6.txt"
("ö.txt"
, если вы интерпретируете это как Latin-1), ту же строку байтов, что и фактическое имя.
Эта ситуация очень отличается от Windows, с которой вы, кажется, знакомы, где имя файла is представляет собой последовательность 16-битных единиц, интерпретируемых как UTF-16 (хотя, насколько мне известно, они не обязательно должны быть действительными UTF -16), а имена файлов, переданные в fopen
и т. д., интерпретируются в соответствии с текущей локалью как символы Unicode, которые затем используются для открытия/доступа к файлу на основе его имени UTF-16.
person
R.. GitHub STOP HELPING ICE
schedule
23.01.2020