Migrate code from Python 2 to Python 3
--- a/tools/generate-unicode.sh
+++ b/tools/generate-unicode.sh
@@ -28,18 +28,18 @@
 
 # Generate the category output data
 echo "Parsing Unicode v${version} categories..."
-python scripts/category-regex.py "data/${version}-database.txt" > "output/categories.js"
+python3 scripts/category-regex.py "data/${version}-database.txt" > "output/categories.js"
 
 # Generate the scripts output data
 echo "Parsing Unicode v${version} scripts..."
-python scripts/script-regex.py "data/${version}-scripts.txt" > "output/scripts.js"
+python3 scripts/script-regex.py "data/${version}-scripts.txt" > "output/scripts.js"
 
 # Generate the blocks output data
 echo "Parsing Unicode v${version} blocks..."
-python scripts/block-regex.py "data/${version}-blocks.txt" > "output/blocks.js"
+python3 scripts/block-regex.py "data/${version}-blocks.txt" > "output/blocks.js"
 
 # Generate the properties output data
 echo "Parsing Unicode v${version} properties..."
-python scripts/property-regex.py > "output/properties.js"
+python3 scripts/property-regex.py > "output/properties.js"
 
 echo "Done."
--- a/tools/scripts/block-regex.py
+++ b/tools/scripts/block-regex.py
@@ -21,7 +21,7 @@
 		block = item[0].replace(' ', '_').replace('-', '_')
 		ranges = createRange(item[1])
 		buf.append(format(block, ranges[0], ranges[1], ranges[2]))
-	print '[\n' + ',\n'.join(buf) + '\n]'
+	print('[\n' + ',\n'.join(buf) + '\n]')
 
 if __name__ == '__main__':
-	main(sys.argv[1])
\ No newline at end of file
+	main(sys.argv[1])
--- a/tools/scripts/category-regex.py
+++ b/tools/scripts/category-regex.py
@@ -63,7 +63,7 @@
 		category = item[0]
 		ranges = createRange(item[1])
 		buf.append(format(category, ranges[0], ranges[1], ranges[2]))
-	print '[\n' + ',\n'.join(buf) + '\n]'
+	print('[\n' + ',\n'.join(buf) + '\n]')
 
 if __name__ == '__main__':
-	main(sys.argv[1])
\ No newline at end of file
+	main(sys.argv[1])
--- a/tools/scripts/property-regex.py
+++ b/tools/scripts/property-regex.py
@@ -32,7 +32,7 @@
 		if isinstance(item, int):
 			buf.append(item)
 		else:
-			data = string.split(item, '-')
+			data = item.split('-')
 			buf.extend(range(int(data[0], 16), int(data[1], 16) + 1))
 	return buf
 
@@ -42,4 +42,4 @@
 		codePointList = toCodePoints(item[1])
 		ranges = createRange(codePointList)
 		buf.append(format(item[0], ranges[0], ranges[1], ranges[2]))
-	print '[\n' + ',\n'.join(buf) + '\n]'
\ No newline at end of file
+	print('[\n' + ',\n'.join(buf) + '\n]')
--- a/tools/scripts/script-regex.py
+++ b/tools/scripts/script-regex.py
@@ -21,7 +21,7 @@
 		script = item[0]
 		ranges = createRange(item[1])
 		buf.append(format(script, ranges[0], ranges[1], ranges[2]))
-	print '[\n' + ',\n'.join(buf) + '\n]'
+	print('[\n' + ',\n'.join(buf) + '\n]')
 
 if __name__ == '__main__':
-	main(sys.argv[1])
\ No newline at end of file
+	main(sys.argv[1])
--- a/tools/scripts/utils.py
+++ b/tools/scripts/utils.py
@@ -117,7 +117,7 @@
 		flag = False
 		first = 0
 		for line in uni:
-			d = string.split(line.strip(), ';')
+			d = line.strip().split(';')
 			val = int(d[0], 16)
 			if flag:
 				if re.compile('<.+, Last>').match(d[1]):
@@ -158,7 +158,7 @@
 		for line in uni:
 			if line.startswith('#') or not ' ; ' in line:
 				continue
-			data = string.split(line.strip(), ';')
+			data = line.strip().split(';')
 			charRange = data[0].replace('..', '-').strip()
 			length = len(charRange)
 			script = data[1].split('#')[0].strip()
@@ -178,7 +178,7 @@
 		for line in uni:
 			if line.startswith('#') or not '; ' in line:
 				continue
-			data = string.split(line.strip(), ';')
+			data = line.strip().split(';')
 			charRange = data[0].replace('..', '-').strip()
 			length = len(charRange)
 			script = data[1].split(';')[0].strip()
