我不能mkdir用来创建UTF-8字符的文件夹:
<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>
Run Code Online (Sandbox Code Playgroud)
当我在Windows资源管理器中浏览此文件夹时,文件夹名称如下所示:
Depósito
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我正在使用php5
我需要使用PHP在文件系统上保存带有非拉丁文件名的文件.
我想让这项工作跨平台.我怎么知道我可以使用什么编码来编写文件?我知道许多现代文件系统都是基于UTF-8(这是正确的吗?),但我怀疑Windows XP(例如).
那么,是否有一个强大的检测机制?
我正在尝试在文件名中创建带有Unicode字符的文件.我不太清楚我应该使用什么编码,或者它是否可能.
我有这个文件,以latin1编码保存:
$h = fopen("unicode_♫.txt", 'w');
fclose($h);
Run Code Online (Sandbox Code Playgroud)
在UTF-8中,这将解码为'unicode_♫.txt'.它将latin1版本写入磁盘(很明显?).我需要它保存,因为它会出现UTF-8解码.我也试过用UTF-16编码它,但那也不行.
我正在使用PHP 5.2,并希望这与NTFS,ext3和ext4一起使用.
如何才能做到这一点?
public static void main(String[] args) throws IOException
{
Scanner in = new Scanner(System.in);
String fileName = in.nextLine();
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("C:/temp/"+fileName+".txt"), "UTF-8"));//Ex thrown
out.close();
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个可以处理中文字符到文件名的编写器.所以我可以创建一个名为??.txtexample 的文件.
但是我得到了FileNotFoundException 上面的代码,它对英文字符完全正常,但不适用于汉字.
我按照这里的答案:如何用Java编写UTF-8文件?生成上面的代码,但它不起作用.
任何人都知道如何实现这一目标?
堆栈跟踪:
Exception in thread "main" java.io.FileNotFoundException: C:\temp\??.txt (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
使用NIO:
Path path = Paths.get("C:/temp/"+fileName+".txt");//throws ex
Charset charset = Charset.forName("UTF-8");
Path …Run Code Online (Sandbox Code Playgroud) 更新:
准备一个错误报告给那些使PHP 7成为可能的伟大人物我再次修改了我的研究,并试图将其简化为几行简单的代码.在这样做时,我发现PHP本身不是问题的原因.我完成后,我会在这里分享我的结果.只是你知道,不要浪费你的时间或东西:)
概要:PHP7现在似乎能够编写UTF-8文件名但无法访问它们?
序言:我在这里阅读了大约10-15篇文章,但是它们并没有帮助我解决问题,它们都比PHP7版本更早.在我看来,这可能是一个新问题,我想知道它是否可能是一个错误.我花了很多时间尝试对字符串进行解码和解码,并试图找到一种方法使其工作 - 无济于事.
大家好日子和来自德国的问候(在这里插入害羞的非母语 - 评论),我希望你能帮助我解决我遇到的这种新现象.从PHP 7开始,它似乎是"新的".
我认为大多数在Windows系统上使用PHP的人都非常熟悉文件名的问题以及PHP的透明包装,它管理对具有非ASCII文件名(或windows-1252或任何系统代码页)的文件的访问.
我不太确定如何处理这个问题,因为你可以看到我在撰写问题方面不是很有经验,所以请不要立刻扯掉我的头.是的,我会努力保持简短.开始了:
第一个症状:更新到PHP7后,我有时会遇到访问我的软件生成的文件的问题.有时它照常工作,有时不工作.我发现不同之处在于PHP7现在似乎能够编写UTF-8文件名但无法访问具有这些名称的文件.
在两个独立的"相同"系统上生成所述文件后(仅在PHP版本中有所不同),这就是在硬盘驱动器上命名文件的方式:
PHP 5.5:Lokaltest_KG_æ¼¢å-_汉-_Krümhold-DEZ1604-140081-complete.zip
PHP 7:Lokaltest_KG_汉字_汉字_Krümhold-DEZ1604-140081-complete.zip
Splendid,PHP 7能够在HDD上编写unicode文件名,而UTF-16则在Windows上使用.现在的缺点是,当我尝试访问这些文件时,例如is_file()PHP 5.5的工作,但PHP 7没有.
考虑一下这段代码片段(注意:我"入侵"了这个函数,因为它是最简单的方法,它不是为此而编写的).生成zip文件后调用此函数,获取客户名称和其他值以确定正确的名称.那些来自数据库.PHP的数据库和内部编码都是UTF-8.clearstatcache本身并不是必要的,但我把它包括在内以使事情更清楚.重要提示:所有发生的事情都是使用PHP7完成的,没有其他实体负责创建zip文件.确切地说,它完成了class ZipArchive.实际上它甚至不是一个zip-archive,重点是文件的文件名和内容是由PHP7创建的 - 成功.
public static function downloadFileAsStream( $file )
{
clearstatcache();
print $file . "<br/>";
var_dump(is_file($file));
die();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
D:/htdocs/otm/.data/_tmp/Lokaltest_KG_??_??_Krümhold-DEZ1604-140081-complete.zip
bool(false)
Run Code Online (Sandbox Code Playgroud)
所以PHP7能够生成文件 - 它们确实存在于硬盘驱动器上并且是合法且可访问的 - 但是无法访问它们.is_file并不是唯一失败的功能,file_exists()例如也是如此.
一个关于编码转换的小实验,让您体验我尝试过的东西:
public static function downloadFileAsStream( $file )
{
clearstatcache();
print $file . "<br/>";
print mb_detect_encoding($file, 'ASCII,UTF-16,windows-1252,UTF-8', false) . …Run Code Online (Sandbox Code Playgroud) 无法从Windows文件系统中读取UTF-8文件名(主要Windows语言为英语)
<?php
$path_to_read = 'D:\music';
class AudioFilterIterator extends FilterIterator
{
public function accept()
{
return (strpos(parent::current(), '.mp3'));
}
}
$object = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path_to_read));
$iterator = new AudioFilterIterator($object);
echo "<pre>";
$files = array();
foreach($iterator as $file)
{
echo $file . "\n";
}
Run Code Online (Sandbox Code Playgroud)
所以,例如,我有一个名为"10Hörtauf.mp3"的文件,但作为输出我得到"10 Hort auf.mp3"
我该如何解决?
我正在开发一个执行大量路径名操作的项目.它在Mac OS X上运行正常,但令我惊讶的是,在Windows 上无法使用utf-8编码字符串调用realpath等函数.这是因为Windows上的setlocale不支持utf-8:
http://msdn.microsoft.com/en-us/library/x99tb11d.aspx
http://www.phpwact.org/php/i18n/utf-8
我可以创建在内部调用utf8_encode和 utf8_decode的包装函数,但是php中有很多文件函数,这给我带来了很大的负担.
此外,该项目是开源的,因此当用户尝试在他们自己的代码中使用我的字符串(所有这些都是面向Web的)来读/写文件时,用户可能会认为它是破坏的.
有没有提供utf-8版本的主要php文件功能的库?我更喜欢扩展名上的自包含目录,以便我可以将其与我的代码捆绑在一起.
我担心如果我找不到像这样的库,那可能是因为我不适合跨平台开发而导致php无法治愈的致命弱点.我也很好奇其他语言如ruby,python和c ++是如何解决这个问题的,如果他们这样做的话.如果没有,这可能只是对Windows的另一次打击,我将不得不找出另一种解决方法.
file_exists()并且file_get_contents()在一个名为output‹ÕÍÕ¥.txt(例如)的文件上失败,虽然我知道它存在?
我猜它与文件名中的特殊字符有关?
所以想知道什么是解决方法?
感谢所有回复.
供参考:
请注意,如果您的想法为什么不简单地更改文件名? - 我不能,因为文件名一般是生成的,更改文件名将意味着使用PHP的文件函数(似乎不允许文件名args中的特殊字符 - 除非我误解/误解了任何东西).
我在Windows上使用PHP 5.2.