BookTranslator
BookTranslator

Cách dịch một tệp TXT lớn: Mã hóa, Chương và Ngắt dòng

Sửa lỗi mã hóa, đánh dấu chương và nối các dòng bị ngắt cứng trước khi dịch một tệp .txt dài. Kèm theo tệp mẫu, công cụ kiểm tra miễn phí và bài thử nghiệm 9 lần chạy.

BookTranslator

BookTranslator Team

21 phút đọc

Để dịch một tệp TXT lớn, hãy chuẩn bị ba việc trước khi tải lên bất cứ đâu. Thứ nhất, đảm bảo văn bản được giải mã chính xác và lưu dưới dạng UTF-8. Thứ hai, đặt mỗi tiêu đề chương trên một dòng riêng, có dòng trống bao quanh. Thứ ba, nếu tệp ngắt dòng ở một độ rộng cố định, hãy nối các dòng đó lại để mỗi đoạn văn là một dòng, với một dòng trống giữa các đoạn. Sau đó dịch toàn bộ tệp, và cuối cùng so sánh số đoạn và số chương giữa bản gốc và bản dịch.

Một tệp văn bản thuần không có kiểu dáng, không có tiêu đề và không có siêu dữ liệu. Mọi thứ mà một công cụ dịch biết về cấu trúc của nó đều đến từ các byte và các ngắt dòng. Đó là lý do tại sao ba vấn đề giống nhau cứ lặp đi lặp lại: các byte được đọc với mã hóa sai, không thể phân biệt các chương với các dòng thông thường, hoặc các ngắt dòng không cho biết câu kết thúc ở đâu.

Chúng tôi đã tạo các tệp mẫu ở bốn kiểu mã hóa, viết một công cụ kiểm tra miễn phí, và dịch một truyện ngắn bị ngắt cứng sang tiếng Trung Giản thể chín lần bằng một mô hình cục bộ. Mô hình xử lý việc ngắt cứng tốt khi nó thấy toàn bộ tệp. Nó làm đứt câu và gán hành động của nhân vật này cho nhân vật khác trong cả ba lần chạy khi tệp bị cắt thành từng phần theo số dòng.

Danh sách kiểm tra nhanh

Kiểm traTrạng thái tốt trông như thế nàoCách khắc phục
Mã hóaCác dòng đầu đọc đúng; tệp là UTF-8Mở lại với mã hóa đúng, sau đó lưu dưới dạng UTF-8
Dấu thứ tự byteKhông có, hoặc có một dấu mà bạn biếtLưu dưới dạng "UTF-8" thay vì "UTF-8 with BOM" nếu một công cụ báo lỗi
Tiêu đề chươngMỗi tiêu đề nằm riêng trên một dòng, có dòng trống trước và sauSửa một vài tiêu đề bị dính vào văn bản
Đoạn vănMột dòng trống giữa các đoạnThêm dòng trống ở những chỗ đoạn văn chỉ bắt đầu bằng thụt lề
Ngắt cứngMỗi đoạn là một dòng dàiNối các dòng trong đoạn, nhưng để nguyên thơ, thư từ và danh sách
Ký tự xuống dòngMột kiểu thống nhất xuyên suốtChuyển đổi ký tự xuống dòng CR kiểu Mac cũ; LF và CRLF đều ổn
Văn bản bị hỏngKhông có ký tự �Hãy lấy một bản sao tốt hơn. Việc chuyển đổi không thể khôi phục các ký tự đã mất

Công cụ kiểm tra sẽ báo cáo trên từng dòng và sửa lỗi mã hóa, dấu thứ tự byte, ký tự xuống dòng và ngắt dòng cứng. Tiêu đề chương và các dòng trống bị thiếu là do bạn tự sửa thủ công. Chạy python3 check_txt.py inspect yourfile.txt để xem báo cáo, và python3 check_txt.py convert yourfile.txt clean.txt --unwrap để ghi một bản sao UTF-8 với các đoạn văn được nối lại. Công cụ chỉ cần Python 3 và không bao giờ thay đổi tệp gốc.

Bước 1: Chọn đúng mã hóa

Tệp TXT là một chuỗi byte. Mã hóa là quy tắc chuyển các byte đó thành ký tự, và bản thân tệp không cho biết quy tắc nào đã được dùng. Nếu một chương trình đoán sai, bạn sẽ gặp hiện tượng mojibake: văn bản bị lỗi ký tự, hoặc tệ hơn, văn bản trông có vẻ ổn nhưng không phải là nội dung đã được viết.

Đây là cùng một cụm từ tiếng Trung, 最后一班渡轮 ("chuyến phà cuối cùng"), được đọc bằng quy tắc sai. Chúng tôi đã tạo các ví dụ này bằng codec tích hợp của Python, và bạn có thể tái tạo chúng với các tệp mẫu.

Được lưu dưới dạngĐược đọc dưới dạngNhững gì bạn thấy
GB18030Windows-1252×îºóÒ»°à¶ÉÂÖ
GB18030UTF-8���һ�����
UTF-8GBK鏈�鍚庝竴鐝�娓¤疆
Shift_JIS (tiếng Nhật 最後のフェリー)GBK嵟屻偺僼僃儕乕

Dòng cuối cùng là dòng nguy hiểm. Các byte tiếng Nhật được đọc như tiếng Trung sẽ tạo ra các ký tự Hán thực sự, không có lỗi và không có �. Một công cụ dịch sẽ vui vẻ dịch chúng, và kết quả sẽ là vô nghĩa nhưng ngữ pháp lại tốt.

Công cụ kiểm tra của chúng tôi cho thấy lý do bạn không thể dựa vào "nó đã mở mà không có lỗi." Khi chúng tôi chạy nó trên mẫu Shift_JIS, hai bảng mã đã giải mã toàn bộ tệp mà không có một lỗi nào:

encoding: unknown (not UTF-8)
these legacy encodings decode without errors; read the previews,
because a wrong one can still produce real-looking characters:
  gb18030  戞堦榖丂嵟屻偺僼僃儕乕
  cp932    第一話 最後のフェリー

Chỉ dòng thứ hai là tiếng Nhật. Dòng đầu tiên là một chuỗi các ký tự Hán hiếm gặp mà không ai viết. Trên mẫu tiếng Trung GB18030, năm bảng mã đã giải mã mà không có lỗi, và chỉ một trong số đó, GB18030, hiển thị tiêu đề chương 第一章 最后一班渡轮. Vì vậy quy tắc rất đơn giản: hãy quyết định mã hóa bằng cách đọc những dòng đầu tiên, chứ không phải dựa vào việc một chương trình có báo lỗi hay không.

Những chỗ phỏng đoán thường sai:

  • Văn bản tiếng Trung từ các hệ thống Windows cũ hoặc các trang web Trung Quốc thường là GBK hoặc GB18030. GB18030 bao phủ mọi thứ GBK có, và Tiêu chuẩn Mã hóa WHATWG, mà các trình duyệt tuân theo, còn đi xa hơn: nó nói rằng "bộ giải mã của GBK là bộ giải mã của gb18030." Nếu một tệp là GBK, mở nó dưới dạng GB18030 sẽ hoạt động.
  • Tiếng Trung Phồn thể từ Đài Loan hoặc Hồng Kông thường là Big5.
  • Tiếng Nhật thường là Shift_JIS, hoặc phiên bản mở rộng của Microsoft, mà Windows và Python gọi là cp932.
  • Tiếng Hàn thường là EUC-KR.
  • Một tệp đầy byte NUL, hoặc một tệp mà mọi ký tự khác trông trống rỗng, thường là UTF-16 không có dấu thứ tự byte.

Dấu thứ tự byte (BOM) là một mã ngắn vô hình ở đầu tệp thông báo UTF-8, UTF-16 hoặc UTF-32. Khi có BOM, hãy tin vào nó. Cùng tiêu chuẩn đó nói rằng "dấu thứ tự byte có thẩm quyền hơn bất cứ thứ gì khác." Công cụ kiểm tra của chúng tôi đọc BOM trước và chỉ phỏng đoán khi không có BOM.

Lưu tệp dưới dạng UTF-8

Khi văn bản đã hiển thị đúng, hãy lưu nó dưới dạng UTF-8. Tiêu chuẩn WHATWG gọi UTF-8 là "mã hóa phù hợp nhất để trao đổi Unicode," và đây là lựa chọn an toàn nhất cho bất kỳ công cụ dịch nào.

Có một lý do thứ hai đặc biệt quan trọng đối với việc dịch. Các bảng mã cũ chỉ bao phủ các ký tự của khu vực riêng. Shift_JIS không có mã cho 这, ký tự đầu tiên của 这是最后一班渡轮, và Big5 cũng không có mã cho nó, vì đây là ký tự tiếng Trung Giản thể. Windows-1252 không thể lưu trữ chữ Kirin. Nếu tệp đã dịch phải được ghi lại bằng bảng mã cũ ban đầu, ngôn ngữ đích có thể không vừa. Công cụ dịch TXT của BookTranslator cho biết nó tự động phát hiện các bảng mã phổ biến và trả về tệp đã dịch "với cùng bảng mã như đầu vào," vì vậy bắt đầu từ UTF-8 loại bỏ hoàn toàn câu hỏi này.

Bạn có thể chuyển đổi trong trình soạn thảo văn bản (mở với đúng bảng mã, sau đó "Lưu thành" UTF-8), với iconv -f GB18030 -t UTF-8 in.txt > out.txt trên macOS hoặc Linux, hoặc với công cụ kiểm tra:

python3 check_txt.py convert book.txt book-utf8.txt --encoding gb18030

Nếu tệp đã chứa ký tự �, thiệt hại đã xảy ra trước khi bạn nhận được nó. Chuyển đổi lại sẽ không khôi phục các ký tự bị thiếu. Hãy tìm một bản sao tốt hơn của nguồn.

Bước 2: Làm cho các chương dễ tìm

Các chương quan trọng vì ba lý do. Một tệp dài được dịch thành từng phần, và các điểm ngắt chương là nơi cắt sạch nhất. Bạn sẽ muốn kiểm tra từng chương sau khi dịch. Và nếu sau này bạn chuyển văn bản thành sách điện tử, các tiêu đề chương sẽ trở thành mục lục.

Đặt mỗi tiêu đề trên một dòng riêng, với một dòng trống trước và sau nó, và sử dụng một mẫu thống nhất trong toàn bộ cuốn sách. Đây là những mẫu mà công cụ kiểm tra của chúng tôi đếm:

  • Chapter 1, Chapter One: The Last Ferry, Part Two, Prologue, Epilogue
  • 第一章, 第12回, 第三話, 第二卷
  • một số hoặc chữ số La Mã đứng một mình trên một dòng, chẳng hạn như 12 hoặc XII.

Chạy inspect và đọc danh sách các tiêu đề mà nó tìm thấy. Nếu cuốn sách có 40 chương và công cụ kiểm tra tìm thấy 37, ba tiêu đề đang ẩn: một tiêu đề chạy vào câu đầu tiên, một tiêu đề dùng từ khác như "Ch. 7," hoặc một tiêu đề có văn bản trên cùng dòng. Hãy sửa ba tiêu đề đó bằng tay. Việc này mất ít thời gian hơn so với việc tìm ra vấn đề trong một tệp đã dịch.

Bước 3: Bỏ ngắt dòng cứng một cách cẩn thận

Một số tệp TXT ngắt mỗi dòng ở một độ rộng cố định, để văn bản vừa với một cửa sổ terminal đơn giản hoặc một cửa sổ hẹp. Văn bản sao chép từ PDF và đầu ra OCR cũng làm điều tương tự ở độ rộng của trang in. Trong những tệp này, một ngắt dòng có nghĩa là "dòng đã đầy," không phải "câu hoặc đoạn đã kết thúc."

Ngắt dòng cứng rất dễ nhận ra. Trong mẫu ngắt dòng cứng của chúng tôi, công cụ kiểm tra đã báo cáo:

non-empty lines: 43; longest line: 66 chars; 25 lines within 12 chars of the longest
line breaks inside paragraphs that do not end a sentence: 23
looks hard-wrapped: consider convert --unwrap

Cách khắc phục là nối các dòng trong mỗi đoạn và giữ các dòng trống giữa các đoạn. Cái bẫy là văn bản có ngắt dòng thật: thơ, lời bài hát, thư từ, địa chỉ, công thức nấu ăn và danh sách. Mẫu của chúng tôi bao gồm một lá thư năm dòng:

My dear Mara,
The key is under the blue pot.
Do not let your uncle sell the boat.
With love, always,
Nonna

Một thao tác "thay thế mọi ngắt dòng đơn bằng dấu cách" sẽ biến nó thành một dòng chạy dài. Tùy chọn --unwrap của công cụ kiểm tra chỉ nối một đoạn khi hầu hết các dòng của nó chạy gần đầy độ rộng, vì vậy các khối dòng ngắn như lá thư này được giữ nguyên. Trên mẫu của chúng tôi, nó đã tái tạo chính xác tệp gốc chưa bỏ ngắt dòng, từng byte một, bao gồm cả lá thư. Trên tệp của riêng bạn, hãy kiểm tra một vài đoạn đã nối và mọi khối thơ trước khi tin tưởng nó.

Hai chi tiết nữa. Khi bạn nối các dòng văn bản tiếng Trung hoặc tiếng Nhật, đừng thêm dấu cách giữa chúng; công cụ kiểm tra nối các dòng CJK, kể cả những dòng kết thúc bằng dấu câu CJK, mà không thêm dấu cách. Và nếu văn bản của bạn đến từ OCR, các từ cũng có thể bị tách bằng dấu gạch nối ở cuối dòng, điều này cần những quyết định riêng. Hướng dẫn của chúng tôi về cách sửa ngắt dòng và gạch nối do OCR đề cập đến vấn đề đó.

Những gì chúng tôi đã thử nghiệm: Văn bản ngắt dòng cứng, toàn bộ so với bị cắt nhỏ

Chúng tôi muốn biết liệu việc ngắt dòng cứng có thực sự làm hỏng bản dịch hay chỉ khiến nó trông không gọn gàng. Chúng tôi đã viết một truyện ngắn 396 từ cho bài kiểm tra: ba chương, mười lăm đoạn văn, lời thoại, bức thư ở trên và một dấu ngắt cảnh * * *. Chúng tôi đã lưu nó hai lần với cùng một từ ngữ: không ngắt dòng, mỗi đoạn một dòng, và ngắt dòng cứng ở 66 ký tự, có 43 dòng không trống thay vì 19.

Sau đó, chúng tôi yêu cầu một mô hình cục bộ dịch nó sang tiếng Trung giản thể theo ba cách, mỗi cách ba lần chạy:

  1. Ngắt dòng, toàn bộ tệp. Tệp ngắt dòng cứng trong một yêu cầu.
  2. Không ngắt dòng, toàn bộ tệp. Tệp không ngắt dòng trong một yêu cầu.
  3. Ngắt dòng, cắt mỗi 12 dòng. Tệp ngắt dòng cứng được chia mỗi 12 dòng, một yêu cầu cho mỗi phần, các phản hồi được ghép lại với nhau. Đây là điều xảy ra khi một script hoặc công cụ chia một tệp dài theo số dòng thay vì theo đoạn văn.

Mô hình là Qwen 3.6 27B (Q4_K_M) trong LM Studio, với chế độ suy nghĩ tắt và nhiệt độ 0.3, trên Apple M4 Max với 64 GB bộ nhớ. Mỗi yêu cầu đều dùng cùng một câu lệnh. Chúng tôi đã chạy nó vào ngày 28 tháng 10 năm 2026. Script là run_llm_txt_test.py, tất cả chín đầu ra được công bố nguyên văn và results.csv có một hàng cho mỗi lần chạy.

Ngắt dòng, toàn bộ tệpKhông ngắt dòng, toàn bộ tệpNgắt dòng, cắt mỗi 12 dòng
Số đoạn văn được giữ (15)3 trên 3 lần chạy3 trên 3 lần chạy0 trên 3 (14 mỗi lần)
Tiêu đề chương được giữ (3)3 trên 33 trên 33 trên 3
Bức thư được giữ thành năm dòng3 trên 33 trên 33 trên 3
Câu bị cắt tại điểm chia003 trong mỗi lần chạy
Hành động bị gán cho nhân vật sai003 trong 3 lần chạy

Phát hiện đầu tiên khiến chúng tôi bất ngờ. Khi mô hình nhìn thấy toàn bộ tệp được ngắt dòng cứng, nó tự nối các dòng lại. Cả ba đầu ra đều có một đoạn văn mỗi dòng, đúng 19 dòng như các lần chạy không ngắt dòng, và đọc cũng mượt như vậy. Vậy nên chỉ ngắt dòng cứng không làm hại mô hình này trên tệp ngắn này.

Cắt tệp theo số dòng thì lại gây hại, ở cùng những chỗ mỗi lần. Ba trong số 12 mảnh kết thúc giữa câu. Mảnh đầu kết thúc ở "He pointed with his" và mảnh tiếp theo bắt đầu bằng "pen at a three-storey building on the corner." Dịch riêng rẽ, nửa sau mất chủ ngữ. Trong hai lần chạy, nó trả về là 她瞥了一眼街角那栋三层楼的建筑, "cô ấy liếc nhìn tòa nhà ba tầng ở góc phố." Trong lần thứ ba, nó kết thúc bằng 随后她重新回到填字游戏上, "sau đó cô ấy quay lại với trò chơi ô chữ." Trong câu chuyện, người đàn ông trong quầy vé chỉ tay và quay lại với trò chơi ô chữ của mình. Trong cả ba lần chạy, người đọc bản tiếng Trung sẽ nghĩ Mara làm việc đó.

Lần cắt thứ hai, giữa "the careful, slightly old-fashioned hand she had learned at a" và "convent school," để câu tiếng Trung lơ lửng ở 那是她在, "đó là nơi cô ấy," trong cả ba lần chạy (một lần chạy thêm một chữ 一 thừa), và từ "learned" biến mất. Lần cắt thứ ba chia câu về những tấm cửa chớp qua hai dòng, và nửa sau biến "painted, not well, but not long ago" thành sơn bong tróc: 油漆虽已斑驳 trong hai lần chạy và 油漆剥落 trong lần thứ ba. Và vì các mảnh được nối bằng một dấu xuống dòng duy nhất, dòng trống trước chỗ ngắt cảnh biến mất, đó là lý do mỗi lần chạy có 14 đoạn văn thay vì 15. Trình kiểm tra của chúng tôi bắt được số đoạn văn. Nó không bắt được nhân vật sai; chúng tôi phát hiện điều đó bằng cách đọc.

Điều này có nghĩa gì cho tệp của bạn:

  • Bỏ ngắt dòng cứng bảo vệ bạn khỏi những trình chia tách bạn không kiểm soát được. Mọi tệp dài đều bị chia ở đâu đó, dù bởi script của bạn, giới hạn của cửa sổ chat, hay công cụ bạn tải lên. Nếu các đoạn văn là những dòng đơn cách nhau bằng dòng trống, bất kỳ trình chia tách hợp lý nào cũng có thể cắt giữa các đoạn văn thay vì bên trong một câu.
  • Những lỗi tệ nhất lại trôi chảy. "Cô ấy liếc nhìn tòa nhà" là tiếng Trung tốt. Người đọc sẽ nhận ra những dấu xuống dòng kỳ lạ ở mỗi chỗ cắt và cụm 那是她在 lơ lửng, nhưng không có gì đánh dấu nhân vật sai hay lớp sơn bong tróc là lỗi. Lỗi ở điểm chia tách trước hết là lỗi ý nghĩa, sau đó mới là lỗi định dạng.
  • Đây là một mô hình và một truyện ngắn. Một tệp ngắn như thế này vừa một yêu cầu, nên các lần chạy toàn tệp không bao giờ phải chia tách gì. Một cuốn tiểu thuyết đầy đủ thì phải chia tách, và đó chính là lúc việc chuẩn bị trong Bước 1 đến 3 phát huy tác dụng. Những tệp này kiểm tra việc chuẩn bị và chia tách, không phải quy trình riêng của BookTranslator.

Một quan sát nhỏ hơn: qua sáu lần chạy toàn tệp, mô hình viết tên Mara là 玛拉 trong năm lần và 马拉 trong một lần. Mỗi đầu ra nhất quán với chính nó, nhưng các yêu cầu riêng rẽ không thống nhất với nhau. Với một cuốn sách dài được dịch thành nhiều mảnh, một danh sách tên và cách viết đã thống nhất giữ mọi chương ăn khớp. Hướng dẫn bảng thuật ngữ của chúng tôi chỉ cách xây dựng một bảng như vậy.

Bước 4: Dịch, rồi kiểm tra số lượng

Khi tệp đã sạch, dịch nó là phần dễ. Bạn có thể tải lên trình dịch TXT của BookTranslator, công cụ chấp nhận tệp .txt, .md và .mdx, cho biết xử lý được tệp TXT lên đến 300 MB, và hiển thị giá trước khi thanh toán. Không có bản dịch đầy đủ miễn phí, nhưng chính việc tải lên cho bạn biết chi phí. Nếu bạn thích làm việc với mô hình chat hoặc LLM cục bộ, hãy tự chia tệp tại ranh giới chương hoặc đoạn văn và giữ một bảng thuật ngữ cho tên riêng. Nếu văn bản của bạn là Markdown chứ không phải văn xuôi thuần, hãy xem hướng dẫn dịch Markdown của chúng tôi, vì cú pháp Markdown cần những quy tắc riêng.

Sau khi dịch, so sánh hai tệp:

python3 check_txt.py compare book-utf8.txt book-translated.txt

Nếu một trong hai tệp không phải UTF-8, hãy thêm --source-encoding hoặc --translated-encoding. Phần kiểm tra chương biết các mẫu tiêu đề tiếng Anh và tiếng Trung/Nhật; với các ngôn ngữ đích khác, hãy thêm từ địa phương cho "chapter" vào mẫu ở đầu script.

Đây là báo cáo cho một trong những lần chạy bị cắt của chúng tôi:

                            source  translated
paragraphs                      15          14  <- differs
chapter headings                 3           3
non-empty lines                 43          24  <- differs
scene breaks (* * *)             1           1
replacement chars                0           0
source script LATIN characters left in translation: 0

Đọc nó như sau:

  • Đoạn văn và tiêu đề chương phải khớp. Một đoạn văn bị thiếu thường có nghĩa là hai đoạn đã bị gộp hoặc một đoạn bị bỏ.
  • Số dòng không trống có thể khác vì lý do chính đáng. Các lần chạy toàn tệp có ngắt dòng cứng của chúng tôi giảm từ 43 dòng xuống 19 vì mô hình đã nối các dòng ngắt cứng, đó là một cải thiện. Chỉ so sánh số dòng khi nguồn đã được bỏ ngắt dòng cứng từ trước.
  • Ký tự thuộc hệ chữ nguồn còn sót lại chỉ ra những đoạn chưa được dịch. Một vài ký tự là bình thường với tên riêng, thuật ngữ sản phẩm hoặc trích dẫn; một chuỗi dài thì là một phần bị bỏ qua.
  • Ký tự thay thế trong bản dịch nghĩa là có vấn đề mã hóa ở đầu ra.

Số lượng không thể cho bạn biết bản dịch có đúng hay không. Hãy đọc đoạn đầu và đoạn cuối của mỗi chương, và các đoạn ở hai bên mỗi chỗ tệp bị chia. Đó là nơi thử nghiệm của chúng tôi tìm thấy mọi lỗi nghiêm trọng.

Câu hỏi thường gặp

Tại sao tệp TXT của tôi trông ổn trong một chương trình và bị lỗi trong chương trình khác?

Hai chương trình đã đoán các bảng mã khác nhau. Một cái đoán đúng. Hãy tìm bảng mã hiển thị văn bản chính xác, rồi lưu tệp dưới dạng UTF-8 để mọi chương trình đọc nó giống nhau.

Tôi có nên chuyển tệp TXT sang EPUB hoặc DOCX trước khi dịch không?

Chỉ khi bạn muốn những gì các định dạng đó bổ sung. Một tệp TXT sạch với các chương rõ ràng vẫn dịch tốt như vốn có. Nếu bạn muốn có mục lục, điều hướng chương và một ebook có thể đọc trên thiết bị, hướng dẫn của chúng tôi về chuyển một web novel thành EPUB sẵn sàng để dịch sẽ trình bày chi tiết.

Tôi có thể dịch một tệp TXT có nhiều ngôn ngữ hỗn hợp không?

Có, nhưng hãy cho công cụ dịch biết những gì cần giữ nguyên. Các trích dẫn hoặc thuật ngữ bằng ngôn ngữ thứ ba, và những tên riêng nên giữ nguyên chữ viết gốc, sẽ dễ bảo vệ hơn bằng một bảng thuật ngữ hoặc một chỉ dẫn ngắn so với việc sửa lại sau đó.

Còn tệp TXT tôi tải xuống từ một trang web thì sao?

Hãy kiểm tra xem bạn có quyền sử dụng tệp đó hay không. Đối với sách thuộc phạm vi công cộng hoặc tệp do chính bạn viết, các bước trên vẫn áp dụng. Bảng mã hoặc định dạng của tệp không cho bạn biết bất cứ điều gì về bản quyền của nó.

Bài viết liên quan