<p>我想出了一个有效的(虽然不理想)解决方案来解决我的问题。在我的Python3(Django)应用程序中,我将字符串转换为字符代码列表。我通过Python2API传递代码列表,而不做任何操作,然后使用PL/SQL将其转换回常规字符</p>
<p><strong>Django代码:</strong></p>
<pre><code>comment = str([ord(c) for c in comment]).strip('[]').replace(' ', '')
# Send comment to API as a parameter
</code></pre>
<p><strong>Python 2 API:</strong></p>
<pre><code># Call PL/SQL function passing in the list of character codes as a string
cursor.callfunc(
'save_comment', cx_Oracle.STRING, [comment]
)
</code></pre>
<p><strong>甲骨文:</strong></p>
<pre><code>FUNCTION save_comment(p_comment VARCHAR2)
RETURN VARCHAR2
IS
v_comment VARCHAR2(500) := '';
v_remain VARCHAR2(500);
v_char VARCHAR2(3);
v_char_code NUMBER;
BEGIN
Comment comes in as list of character codes
'74,111,235,108,108,101,32,75,252,115,101,108,32,78,250,241'
v_remain := p_comment;
WHILE v_remain IS NOT NULL LOOP
Pop the first character code from the list
IF v_remain LIKE '%,%' THEN
v_char := substr(v_remain, 1, instr(v_remain, ',')-1);
v_remain := substr(v_remain, instr(v_remain, ',') + 1);
ELSE
v_char := v_remain;
v_remain := NULL;
END IF;
Turn character code from VARCHAR2 into NUMBER
v_char_code := to_number(v_char);
Convert Python char code to Oracle char code
IF v_char_code >= 192 THEN
v_char_code := v_char_code + 49856;
ELSIF v_char_code > 160 THEN
v_char_code := v_char_code + 49664;
END IF;
Add this character to the comment
v_comment := v_comment || chr(v_char_code);
END LOOP;
RETURN v_comment;
END;
</code></pre>
<p>这个方便的ASCII字符代码列表是一个很好的资源:<br/>
<a href="https://www.techonthenet.com/ascii/chart.php" rel="nofollow noreferrer">https://www.techonthenet.com/ascii/chart.php</a></p>