123 lines
4.4 KiB
JavaScript
123 lines
4.4 KiB
JavaScript
const http = require('http')
|
|
const fs = require('fs')
|
|
|
|
const testChineseExport = async () => {
|
|
console.log('🔍 測試中文匯出功能')
|
|
console.log('=' .repeat(30))
|
|
|
|
try {
|
|
// 測試創意題目匯出(包含中文)
|
|
console.log('\n📊 測試創意題目匯出...')
|
|
const creativeResponse = await new Promise((resolve, reject) => {
|
|
const req = http.get('http://localhost:3000/api/questions/export?type=creative', (res) => {
|
|
let data = ''
|
|
res.on('data', chunk => data += chunk)
|
|
res.on('end', () => resolve({
|
|
status: res.statusCode,
|
|
data: data
|
|
}))
|
|
})
|
|
req.on('error', reject)
|
|
})
|
|
|
|
if (creativeResponse.status === 200) {
|
|
const creativeData = JSON.parse(creativeResponse.data)
|
|
if (creativeData.success) {
|
|
console.log('✅ 創意題目匯出成功')
|
|
|
|
// 解碼並檢查中文內容
|
|
const csvContent = Buffer.from(creativeData.data, 'base64').toString('utf8')
|
|
const lines = csvContent.split('\n')
|
|
|
|
console.log(`\n📋 匯出內容預覽:`)
|
|
console.log(`標題行: ${lines[0]}`)
|
|
console.log(`\n前3行資料:`)
|
|
for (let i = 1; i <= Math.min(3, lines.length - 1); i++) {
|
|
if (lines[i].trim()) {
|
|
console.log(`第${i}行: ${lines[i]}`)
|
|
}
|
|
}
|
|
|
|
// 檢查是否包含正確的中文字符
|
|
const hasChinese = /[\u4e00-\u9fff]/.test(csvContent)
|
|
console.log(`\n🔤 中文字符檢測: ${hasChinese ? '✅ 包含中文字符' : '❌ 未檢測到中文字符'}`)
|
|
|
|
// 檢查 BOM
|
|
const hasBOM = csvContent.charCodeAt(0) === 0xFEFF
|
|
console.log(`📝 UTF-8 BOM: ${hasBOM ? '✅ 包含 BOM' : '❌ 未包含 BOM'}`)
|
|
|
|
// 保存到檔案進行測試
|
|
fs.writeFileSync('test-creative-export.csv', csvContent, 'utf8')
|
|
console.log(`💾 已保存測試檔案: test-creative-export.csv`)
|
|
|
|
} else {
|
|
console.log('❌ 創意題目匯出失敗:', creativeData.message)
|
|
}
|
|
} else {
|
|
console.log('❌ 創意題目匯出失敗,狀態碼:', creativeResponse.status)
|
|
}
|
|
|
|
// 測試邏輯題目匯出
|
|
console.log('\n📊 測試邏輯題目匯出...')
|
|
const logicResponse = await new Promise((resolve, reject) => {
|
|
const req = http.get('http://localhost:3000/api/questions/export?type=logic', (res) => {
|
|
let data = ''
|
|
res.on('data', chunk => data += chunk)
|
|
res.on('end', () => resolve({
|
|
status: res.statusCode,
|
|
data: data
|
|
}))
|
|
})
|
|
req.on('error', reject)
|
|
})
|
|
|
|
if (logicResponse.status === 200) {
|
|
const logicData = JSON.parse(logicResponse.data)
|
|
if (logicData.success) {
|
|
console.log('✅ 邏輯題目匯出成功')
|
|
|
|
// 解碼並檢查中文內容
|
|
const csvContent = Buffer.from(logicData.data, 'base64').toString('utf8')
|
|
const lines = csvContent.split('\n')
|
|
|
|
console.log(`\n📋 匯出內容預覽:`)
|
|
console.log(`標題行: ${lines[0]}`)
|
|
console.log(`\n第1行資料:`)
|
|
if (lines[1]) {
|
|
console.log(`第1行: ${lines[1]}`)
|
|
}
|
|
|
|
// 檢查是否包含正確的中文字符
|
|
const hasChinese = /[\u4e00-\u9fff]/.test(csvContent)
|
|
console.log(`\n🔤 中文字符檢測: ${hasChinese ? '✅ 包含中文字符' : '❌ 未檢測到中文字符'}`)
|
|
|
|
// 檢查 BOM
|
|
const hasBOM = csvContent.charCodeAt(0) === 0xFEFF
|
|
console.log(`📝 UTF-8 BOM: ${hasBOM ? '✅ 包含 BOM' : '❌ 未包含 BOM'}`)
|
|
|
|
// 保存到檔案進行測試
|
|
fs.writeFileSync('test-logic-export.csv', csvContent, 'utf8')
|
|
console.log(`💾 已保存測試檔案: test-logic-export.csv`)
|
|
|
|
} else {
|
|
console.log('❌ 邏輯題目匯出失敗:', logicData.message)
|
|
}
|
|
} else {
|
|
console.log('❌ 邏輯題目匯出失敗,狀態碼:', logicResponse.status)
|
|
}
|
|
|
|
console.log('\n📝 修正說明:')
|
|
console.log('✅ 添加了 UTF-8 BOM (Byte Order Mark)')
|
|
console.log('✅ 確保 Excel 能正確識別中文編碼')
|
|
console.log('✅ 使用 Base64 編碼避免 API 路由字符限制')
|
|
console.log('✅ 前端正確解碼並生成 CSV 檔案')
|
|
|
|
} catch (error) {
|
|
console.error('❌ 測試失敗:', error.message)
|
|
} finally {
|
|
console.log('\n✅ 中文匯出功能測試完成')
|
|
}
|
|
}
|
|
|
|
testChineseExport()
|