Jump to content
php.lv forumi

Failu sistēmas encodings.


Maris-S

Recommended Posts

Man te sanāca saskarties ar vienu encodingu problēmu, varbūt ka kādam ir sanācis viņu atrisināt.

 

Vārdu sakot problēma ir sekojoša.

Vajadzīgs uztaisīt failu augšupielādes skriptu, kur uz servera faili tiek glabāti ar tādu pašu nosaukumu kāds tiek sūtīts. Viss strādā ļoti jauki, kamēr netiek sūtīts kaut kas, teiksim krievu vai japāņu valodās. Fails veiksmīgi augšupielādējās, mājas lapā viņu arī var redzēt, jo visur ir saglabāts ar UTF-8, bet windows failu sistēmai ir man šķiet ka UTF-16, tāpēc pats windowss redz tos kā ķeburus. Konkrētajā gadījumā tas neder, jo ar failiem jāstrādā gan no mājas lapas gan no windowsa. Php string konvertācijas komandas, piemēram multibyte string funkcijas neatrisina problēmu.

 

Daļēju risinājumu sanāca panākt taisot atsevišķu programmu (ne php, šajā gadījumā uz delphi), ko izmantot funkcijas move_uploaded_file() vietā un izsaukt to kaut vai ar php funkciju exec(), kas visu sakonvertē kā vajag. Šajā gadījumā widows visu redz kā vajag normāli viss strādā, bet tagad php komandas kas nolasa failus neredz viņus, nu nolasīšanai atkal tika izveidota programma, visu nolasīja izvadīja, viss kārtībā, bet tiklīdz sāc izmantot php funkcijas kas strādā ar failiem (piemēram, is_file(), filesize() un tml.) tad protams ka nekas nestrādā. Varētu jau visām nepieciešamām operācijām taisīt atbilsotšas programmas un ar php tās izsaukt, tomēr nevisai racionāli sanāk. Varbūt kāds zina, vai patiešām php nav iespējas normāli veikt failu nosaukumu pārkodēšanu?

Link to comment
Share on other sites

kaada jeega glabaat failu japaanju valodaa? tadi jau randomaa pieshkiram vinjam nosaukumu.

kaa tad tu ar delfiem vinju konvertee? varbuut kaut kas ar tiesiibaam nav?

kas notiek kad palaiz readdir ? ko php nolasa?

Link to comment
Share on other sites

Nu japāņu valoda tas kā piemērs, diezvai būs japāņu, bet krievu, franču (viņiem arī ir daži specifiski simboli), vācu gan var gadīties, randomā nosaukumu nederēs ģenerēt, jo failam jāpaliek ar savu nosaukumu. Php visu nolasa kā vajag gadījumā ja nekas netiek konvertēts, bet gan saglabāts pa tiešo kā UTF-8, tomēr tad vindowsā redz ķeburus, kā jau minēju ar failiem būs jāstrādā ne tikai no mājas lapas.

 

Ja fails tiek pārkonvertēts tad readdir() viņu vienkārši neredz. To var panākt arī ievietojot direktorijā jebkuru failu, kam nosaukums ir krievu valodā, viņu vienkārši neredz, nu es nemēģināju kā ir ja ir uzstādīti krievu reģionālie settingi. Man vienkārši šķiet ka tādas funkcijas kā move_uploaded_file(), copy(), rename() ir stipri aprobežotas multilanguage ziņā...

 

Delphi visticamāk pārkonvertē līdzīgi kā to varētu izdarīt ar php multibyte string funkcijām, vienkārši pats tās programmas netaisīju, to taisīja kolēģis. Problēma jau nav pašā konvertācijā kā tādā, bet gan tur ka php failu informācijas un pārvietošanas/kopēšanas funkcijas nevar pareizi apstrādāt pārkonvertētās rezultējošās rindas.

 

Glabāšana datubāzē arī neder, jo faili var tikt pievienoti ne tikai no mājas lapas, bet gan pa tiešo arī.

 

Php strādā pa tiešo ar direktoriju, gan nolasa kas jau tur ir, gan arī pievieno tajā failus.

Edited by Maris-S
Link to comment
Share on other sites

visur ir saglabāts ar UTF-8, bet windows failu sistēmai ir man šķiet ka UTF-16, tāpēc pats windowss redz tos kā ķeburus.

Problēma noteikti ir citur. Jebko, ko var UTF-8 nokodēt, to var arī UTF-16 nokodēt, jo abi ir variable-width viena un tā paša (tāds ir viens vienīgs) Unicode kodējumi.

Link to comment
Share on other sites

Nu jā, taisnība jau ir pārkodēt string mainīgos var, bet funkcijas, kas paredzētas darbībai ar failiem neņem vairs viņas pretī kā vajag, no windowsa šoreiz diemžēl atteikties arī nesanāks. Papētīšu to ext2 uz windows, ja nelīdzēs, tad neko darīt, nāksies kolēģim prasīt lai programmiņas taisa failu manipulēšanai: kopēšanai, izmēra nolasīšanai un tml., nekas cits jau izskatās ka neatliek.

Link to comment
Share on other sites

Ah, tu domā php funkcijas? Jā, tās iespējams, ka nevar. Taču Windows API funkcijas to var un atbalsta - failu nosaukumus ar ne-ASCII simboliem.

Droši vien php6 jāgaida, kur stringi būs unikodes un fopen'am varēs padod unikodes strinug.

Link to comment
Share on other sites

Varbūt vari sameklēt kādu CLI tūlīti (tb tādu, kam ir komandrindas interfeiss), kam var padot faila nosaukumu un tas māk veikt dažādas darbības ? Un tad ar system() vai exec() izmantot to. Domāju, ka php nevajadzētu būt problēmām ar utf8 stringu padošanu šādā veidā.

Link to comment
Share on other sites

×
×
  • Create New...