『漫游』酷论坛>『字幕制作交流区』>[原创]ASS转SRT脚本(更 ..

[原创]ASS转SRT脚本(更新,支持所有编码)(BUG修正)

小飞@2005-06-12 16:28

由于看不惯subresync.exe转的SRT坐标乱伦
所以花了N小时搞定了这个

使用方法:
把下边的代码用记事本保存为.wsf
把要转换的ASS或SSA文件拖上来就是了

相对于subresync.exe的优点:
1,转换后保留{\pos(x,y)}
2,转换后保留Style Default

相对于subresync.exe的缺点
1,没有GUI
2,还有很多,等待你的弥补
3,...
4,...

注:输入输出文件均为utf-8
若要修改输入输出的为其他
用记事本打开,在3,4行找到
cInput和cOutput,
改成你想要的,如unicode,gb2312,big5
以及HKEY_CLASSES_ROOT\MIME\Database\Charset下的一切编码

复制代码


如果不行,请去http://bbs.ktxp.com/read.php?tid=92214&page=e#a
引用

V1046-R@2005-06-12 16:39

POPSUB直接转= =b
引用

weilai@2005-06-12 18:01

不錯哦~
不過剛剛試了個UTF-8的 ass 結果變成亂碼 ※日文字
又改成 Unicode 轉不出內容,style 是當初的 .ass內容,且變成亂碼

轉成 DVD用的字幕會更好^^ (要求太過份了^^||)

其實是那個雙字元組造成的
VBScript 裡的字串運算都會自動轉成雙字元的
所以請善用
AscB、MidB、LenB

==================
個人前陣子寫的加解密腳本讓您參考

========加密=======
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fsot, ft
Dim ValCrypt
Dim BoolMsg
On Error Resume Next

ValCrypt = Cint(InputBox("請輸入加密密碼 ※需為大於等於100之正整數"))
BoolMsg = MsgBox("是否指定單一文件加密(答""否""的話就是使用 Crypt.List批次處理)",vbYesNoCancel,"指定加密文件")
If BoolMsg = vbNo Then
Set fsot = CreateObject("Scripting.FileSystemObject")
Set ft = fsot.OpenTextFile("Crypt.List", ForReading)
While Not ft.AtEndOfStream
ReadWriteFile ft.ReadLine
Wend
ElseIF BoolMsg = vbYes Then
ReadWriteFile InputBox("請輸入File完整名稱")
End IF

On Error GoTo 0

Sub ReadWriteFile(FileNameStr)
Dim fso, f1, f2, i
Dim NewText, ReadAllTextFile
Dim ValTristate

Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.OpenTextFile(FileNameStr, ForReading, False, TristateUseDefault)
Set f2 = fso.OpenTextFile(FileNameStr, ForReading, False, TristateTrue)

ReadAllTextFile = f1.ReadAll
NewText = f2.ReadAll
If StrComp(ReadAllTextFile, NewText) Then
ValTristate = TristateUseDefault '開啟檔案為系統預設狀態
Else
ValTristate = TristateTrue 'Unicode
End If
f2.Close
NewText = Empty

ReadAllTextFile = StrReverse(ReadAllTextFile)
For i = 1 to LenB(ReadAllTextFile)
NewText = NewText + CStr(AscB(MidB(ReadAllTextFile, i, 1)) + ValCrypt)
Next

Set f1 = fso.OpenTextFile(FileNameStr + ".Crypt", ForWriting, True, ValTristate)
f1.Write NewText
End Sub


=======解密========
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fsot, ft
Dim ValCrypt
Dim BoolMsg
On Error Resume Next

ValCrypt = Cint(InputBox("請輸入當初設定之文件解密密碼(正整數)"))
BoolMsg = MsgBox("是否解密所有.Crypt文件(答""是""的話會根據Crypt.List文件列表;答""否""的話請輸入單一文件)",vbYesNoCancel,"指定解密文件")
If BoolMsg = vbYes Then
Set fsot = CreateObject("Scripting.FileSystemObject")
Set ft = fsot.OpenTextFile("Crypt.List", ForReading, False, TristateUseDefault)
While Not ft.AtEndOfStream
ReadWriteFile ft.ReadLine, ValCrypt
Wend
ElseIF BoolMsg = vbNo Then
ReadWriteFile InputBox("請輸入文件完整名稱"), ValCrypt
End IF
On Error GoTo 0

Sub ReadWriteFile(FileNameStr, ByValCrypt)
Dim fso, f1, f2, i
Dim NewText, ReadAllTextFile
Dim ValTristate, ValLen

Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.OpenTextFile(FileNameStr + ".Crypt", ForReading, False, TristateUseDefault)
Set f2 = fso.OpenTextFile(FileNameStr + ".Crypt", ForReading, False, TristateTrue)

ReadAllTextFile = f1.ReadAll
NewText = f2.ReadAll
If StrComp(ReadAllTextFile, NewText) Then
ValTristate = TristateUseDefault '開啟檔案為系統預設狀態
Else
ValTristate = TristateTrue 'Unicode
End If
f2.Close
NewText = Empty

ValLen = Len(CStr(ByValCrypt))
For i = 1 to Len(ReadAllTextFile) Step ValLen
NewText = NewText + ChrB(CInt(Mid(ReadAllTextFile, i, ValLen))- ByValCrypt)
Next
NewText = StrReverse(NewText)

Set f1 = fso.OpenTextFile("Decode_" + FileNameStr, ForWriting, True, ValTristate)
f1.Write NewText
End Sub
引用

小飞@2005-06-12 19:50

上边的脚本很是受教,已经研究并保存

另,想让VBS支持UTF-8真是比登天还难....
谁叫Script的输入只支持ANSI和UNICODE的文本呢,还有个DEFAULT等于没有.
如果不能BIN输入的话要支持UTF-8是不可能的,我想
即使再怎么用AscB、MidB、LenB也没办法,

只能等M$把WSH升到6.0了吧....
引用

小飞@2005-06-12 19:53

另另: DVD字幕如果是文本文件的话理论上用脚本也可以转,但是……

关于POPSUB问题
之前不知道嘛,
反正写都写好了,
不发也浪费,
即使发了也浪费!
引用

小飞@2005-06-12 19:59

后记:
第一次用JS和VBS混写脚本
感觉还真不错

用JS写正则很是方便
用VBS写文件输入输出是很顺手
引用

weilai@2005-06-13 11:17

引用
最初由 小飞 发布
上边的脚本很是受教,已经研究并保存

另,想让VBS支持UTF-8真是比登天还难....
谁叫Script的输入只支持ANSI和UNICODE的文本呢,还有个DEFAULT等于没有.
如果不能BIN输入的话要支持UTF-8是不可能的,我想
即使再怎么用AscB、MidB、LenB也没办法,

只能等M$把WSH升到6.0了吧....


^^
您可以試試
用我寫的加密腳本
用一份 UTF-8 試試 (Unicode 也通)
會形成一個 ANSI 的加密文件 (Unicode 的源會變出一個 Unicode 的加密文件)
再用解密腳本

ANSI 的加密文件 會還原成 UTF-8 文件 (用FC 比較,結果當然是一模一樣)
(Unicode 的加密文件 會還原成 Unicode 文件,結果也是...)

所以 UTF-8 不是不可能的
至於要則麼做
您可以研究一下
引用

kutinasi@2005-06-13 12:26

引用
最初由 V1046-R 发布
POPSUB直接转= =b


popsub不会去转STR坐标之类的, 统统忽略
引用

V1046-R@2005-06-13 13:10

引用
最初由 kutinasi 发布


popsub不会去转STR坐标之类的, 统统忽略

原来如此.
我也去试试 下.
辛苦辛苦^^b
引用

MeteorRain@2005-06-13 21:33

恩……我更喜欢用php命令行来写小脚本
不管是正规表达式还是文件输入输出或者是iconv,都是相当方便的……
引用

ywang84@2005-06-14 05:42

多谢

不过这样的工具在网上已经有很多了吧
引用

小飞@2005-06-16 09:37

引用
最初由 weilai 发布


^^
您可以試試
用我寫的加密腳本
用一份 UTF-8 試試 (Unicode 也通)
會形成一個 ANSI 的加密文件 (Unicode 的源會變出一個 Unicode 的加密文件)
再用解密腳本

ANSI 的加密文件 會還原成 UTF-8 文件 (用FC 比較,結果當然是一模一樣)
(Unicode 的加密文件 會還原成 Unicode 文件,結果也是...)

所以 UTF-8 不是不可能的
至於要則麼做
您可以研究一下

UTF-8话,您的脚本将会用ANSI的方式打开(因为UTF-8格式的英文字符和ANSI一样吧)
然后,就进行加密,不管里边的中文是如何的乱码
解迷的时候也解成乱码写进去
所以还是可以支持UTF-8的
因为您的脚本不需要对乱码解析

而我的脚本需要对乱码解析……
如今我也觉得是可能的,
但是看似工程量十分浩大!

我试试看吧……
引用

小飞@2005-06-16 13:08

在GOOGLE上找到一个代码可以写UTF-8文件
吓了一跳!

with createobject("adodb.stream")
.Type=2
.Open
.Charset="utf-8"
.WriteText "a"
.savetoFile "a.txt"
end with

有空研究一下adodb.stream
相传他可以从网上下载文件……
引用

小飞@2005-06-16 14:19

用ADO读文件:

with createobject("adodb.stream")
.Open
.Charset="utf-8"
.LoadFromFile("a.txt")
msgbox .readtext
end with

理论上可以支持HKEY_CLASSES_ROOT\MIME\Database\Charset下所有编码

就是有个缺点,不能readline……
引用

小拿@2005-06-16 23:18

没有教材 郁闷! 程序一看就懂 可是没有语法呵函数接口指南啊
引用

«12»共2页

| TOP