Özellikle Excel'in bunları işleme biçimiyle CSV dosyaları aracılığıyla bir veritabanına veri alıp vermek için birkaç komut dosyasından UTF-8 davranışı alıyorum.Excel'in PHP kullanarak UTF-8 işlemlerini kolaylaştırmanın bir yolu var mı?
İçe
:komut kendileri özellikle karmaşık değildir ve ben doğru kodlamayı ayarlıyorum inanıyoruz (kısalık uğruna, ben hata işleme ve karakter kaçan kodu hariç) genel
header("Content-Type: text/plain; charset=UTF-8");
require_once("inc.db.php"); // database connection
mysql_query("SET NAMES utf8");
$csv = $_FILES['csv'];
$handle = fopen($csv['tmp_name'], "r");
while ($data = fgetcsv($handle, 1000, ',', '"')) {
$first_name = $data[0];
$family_name = $data[1];
$company = $data[2];
mysql_query("INSERT INTO table SET first_name = '$first_name', etc...);
}
İhracat
header("Content-Type: text/csv; charset=UTF-8");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "\xEF\xBB\xBF"); // utf-8 bom
setlocale(LC_ALL, "en_US.UTF8");
require_once("inc.db.php"); // database connection
mysql_query("SET NAMES utf8");
echo "FIRST NAME,FAMILY NAME,COMPANY,\n";
$query = mysql_query("SELECT first_name, family_name, company FROM table");
while ($data = mysql_fetch_assoc($query)) {
echo '"' . $first_name . '","' . $family_name. '","' . $company. '",\n';
}
// Alternate attempt at looping below
$array = array();
while ($data = mysql_fetch_assoc($query)) {
$array[] = $data;
}
$x = fopen("php://output", "w");
foreach ($array as $fields) {
fputcsv($x, $fields);
}
fclose($x);
için Gözüm, bu senaryoların her ikisi de iyi çalışıyor, şu ana kadar hiç sorun yok. Ancak, Excel'de dışa aktarılan CSV dosyasını açtığımda ve çalıştığımda, ilginç şeyler burada başlar.
Veritabanındaki bilgiler, é
ve Ü
gibi yabancı latin karakterler içeriyor. Bunlar doğru bir şekilde saklanıyor (MySQL veritabanı kodlaması utf8_unicode_ci
), henüz sorun yok. Ancak, üç senaryodan yalnızca ikisi doğru olarak çalışıyor. Ama tahmin et ki, işe yaramayacak olan (Senaryo İki), çalışmak zorunda olduğum şey ... bu her zaman böyle olmaz mı?
Ben hemen-yeniden içe aktarın bir CSV dosyasını dışa, ve One
Senaryo. Dosyayı hiçbir şekilde açmam veya değiştirmem.
Maalesef bu anlamsız bir alıştırmadır. Yine de işe yarıyor.
Sonra yeniden ithalat, açmak, bir CSV dosyasını dışa içeriğini değiştirmek, kaydetme ve İki
Senaryo.
İlginç not: Excel'deki iletişim menüsünden "Kaydet" i seçtiğinizde, CSV dosyasının üzerine yazmak yerine "Unicode Metin" dosyası olarak kaydedilir. Bu yeni dosya hala Excel'de açılıyor, ancak veriler bozuk. "Farklı Kaydet ..." i seçmem ve dosya türü menüsünden "Virgülle Ayrılmış Değerler" i seçmem gerekiyor. Bu adımda kodlama menüsünden UTF-8'i seçmeyi denedim.
bu senaryo ile sorun yabancı karakterlerin yatıyor: en kısa sürede ithal komut bunlardan birini ulaşır ulaşmaz, veritabanına bu alanı yazma basitçe durur. Bozuk karakter yok â€
. Küçük soru işaretleri yok �
. Basitçe, hiçbir şey. Ancak, CSV'nin bu satırındaki verilerin geri kalanı iyi yazılmıştır.
Ben, açmak, bir CSV dosyasını dışa içeriğini değiştirmek, kaydetme, açık bir metin editörü, daha sonra, UTF-8 kodlaması ile yeniden ithalat yeniden kaydetmek Üç
Senaryo.
Yaşasın, işe yarıyor! Bununla birlikte, bu sistemin kullanıcılarının metin editörleri ve kodlamaları ile oynamasını bekleyemiyorum - dışa aktarma> düzenleme> kaydetme> kesintisiz olarak içe aktarılabilmeleri gerekir. script'lerime birinde
- Something (muhtemelen ithal) ™ Yanlış gidiyor Neler
Benim Düşünceler doğru kodlamayı işleyen değil.
- Komut dosyalarından birinde (büyük olasılıkla dışa aktarma) bir CSV dosyası oluşturulamıyor, dolayısıyla Kaydet iletişim kutusundaki Unicode Metin dosya türü.
- Excel sadece gerçekten UTF-8 dosyalarını sevmiyor ve yapabileceğim hiçbir şey yok.
Lütfen bana burada benim hatamın olduğunu söyleyin ve bu konuda yapabileceğim bir yol var!
Mac veya Excel'de Excel kullanıyor musunuz? Mac ile ilgili Excel'de farklı kodlamalarla karşılaştırıldığında Windows ile ilgili bazı sorunlar yaşadığımı biliyorum. – st2erw2od
Bu, Windows, Office 2010 ve 2013 üzerindedir. – mpdc